wolfpack-mcp 1.0.43 → 1.0.44

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/client.js CHANGED
@@ -53,6 +53,14 @@ export class WolfpackClient {
53
53
  const response = await this.api.get('/teams');
54
54
  return response.teams;
55
55
  }
56
+ // Team Member methods
57
+ async listTeamMembers(teamSlug) {
58
+ const params = new URLSearchParams();
59
+ if (teamSlug)
60
+ params.append('teamSlug', teamSlug);
61
+ const query = params.toString();
62
+ return this.api.get(`/team-members${query ? `?${query}` : ''}`);
63
+ }
56
64
  // Helper to fetch all pages of a paginated endpoint
57
65
  async fetchAllPages(endpoint, baseParams) {
58
66
  // First request to get total count
@@ -252,6 +260,13 @@ export class WolfpackClient {
252
260
  throw error;
253
261
  }
254
262
  }
263
+ async createRadarItem(data) {
264
+ const { teamSlug, ...rest } = data;
265
+ return this.api.post('/radar-items', { ...rest, teamSlug });
266
+ }
267
+ async updateRadarItem(itemId, data, teamSlug) {
268
+ return this.api.patch(this.withTeamSlug(`/radar-items/${itemId}`, teamSlug), data);
269
+ }
255
270
  // Issue methods
256
271
  async listIssues(options) {
257
272
  const params = new URLSearchParams();
@@ -433,6 +448,20 @@ export class WolfpackClient {
433
448
  async createIssueComment(issueId, data, teamSlug) {
434
449
  return this.api.post(this.withTeamSlug(`/issues/${issueId}/comments`, teamSlug), data);
435
450
  }
451
+ async deleteWorkItemComment(workItemId, commentId, teamSlug) {
452
+ return this.api.delete(this.withTeamSlug(`/work-items/${workItemId}/comments/${commentId}`, teamSlug));
453
+ }
454
+ async deleteIssueComment(issueId, commentId, teamSlug) {
455
+ return this.api.delete(this.withTeamSlug(`/issues/${issueId}/comments/${commentId}`, teamSlug));
456
+ }
457
+ // Category methods
458
+ async listCategories(teamSlug) {
459
+ const params = new URLSearchParams();
460
+ if (teamSlug)
461
+ params.append('teamSlug', teamSlug);
462
+ const query = params.toString();
463
+ return this.api.get(`/categories${query ? `?${query}` : ''}`);
464
+ }
436
465
  /**
437
466
  * Upload an image and get back a URL that can be used in markdown content.
438
467
  */
package/dist/index.js CHANGED
@@ -176,6 +176,31 @@ const GetRadarItemSchema = z.object({
176
176
  item_id: z.string().describe('The refId (number) of the radar item'),
177
177
  project_slug: z.string().optional().describe('Project slug (required when looking up by refId)'),
178
178
  });
179
+ const CreateRadarItemSchema = z.object({
180
+ project_slug: z
181
+ .string()
182
+ .optional()
183
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
184
+ title: z.string().describe('Title of the radar/initiative item'),
185
+ description: z.string().optional().describe('Description of the initiative (markdown)'),
186
+ stage: z
187
+ .enum(['pending', 'now', 'next', 'later', 'completed'])
188
+ .describe('Stage: "pending" (not started), "now" (current sprint), "next" (upcoming), "later" (future), "completed"'),
189
+ });
190
+ const UpdateRadarItemSchema = z.object({
191
+ item_id: z.string().describe('The refId (number) of the radar item to update'),
192
+ title: z.string().optional().describe('Updated title'),
193
+ description: z.string().optional().describe('Updated description (markdown)'),
194
+ notes: z.string().optional().describe('Updated internal notes (markdown)'),
195
+ stage: z
196
+ .enum(['pending', 'now', 'next', 'later', 'completed'])
197
+ .optional()
198
+ .describe('Updated stage'),
199
+ project_slug: z
200
+ .string()
201
+ .optional()
202
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
203
+ });
179
204
  // Issue schemas
180
205
  const ListIssuesSchema = z.object({
181
206
  project_slug: z.string().optional().describe('Project slug to filter issues'),
@@ -263,8 +288,18 @@ const UpdateIssueSchema = z.object({
263
288
  .optional()
264
289
  .describe('Updated status'),
265
290
  severity: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Updated severity'),
291
+ type: z
292
+ .enum(['bug', 'feature-request', 'task', 'improvement', 'question'])
293
+ .optional()
294
+ .describe('Updated type'),
266
295
  assigned_to_id: z.string().optional().describe('Updated assignee'),
267
296
  closing_note: z.string().optional().describe('Closing note (when closing the issue)'),
297
+ environment: z.string().optional().describe('Environment where the issue occurred'),
298
+ affected_version: z.string().optional().describe('Affected version'),
299
+ reproducible: z.boolean().optional().describe('Whether reproducible'),
300
+ steps_to_reproduce: z.string().optional().describe('Steps to reproduce'),
301
+ expected_behavior: z.string().optional().describe('Expected behavior'),
302
+ actual_behavior: z.string().optional().describe('Actual behavior'),
268
303
  project_slug: z
269
304
  .string()
270
305
  .optional()
@@ -380,6 +415,22 @@ const CreateIssueCommentSchema = z.object({
380
415
  .optional()
381
416
  .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
382
417
  });
418
+ const DeleteWorkItemCommentSchema = z.object({
419
+ work_item_id: z.string().describe('The work item refId (number)'),
420
+ comment_id: z.string().describe('The comment ID to delete'),
421
+ project_slug: z
422
+ .string()
423
+ .optional()
424
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
425
+ });
426
+ const DeleteIssueCommentSchema = z.object({
427
+ issue_id: z.string().describe('The issue refId (number)'),
428
+ comment_id: z.string().describe('The comment ID to delete'),
429
+ project_slug: z
430
+ .string()
431
+ .optional()
432
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
433
+ });
383
434
  // Image upload schema
384
435
  const UploadImageSchema = z.object({
385
436
  file_path: z
@@ -404,6 +455,20 @@ const GetSkillResourceSchema = z.object({
404
455
  skill_name: z.string().describe('The name of the skill'),
405
456
  resource_name: z.string().describe('The name of the resource file'),
406
457
  });
458
+ // Category schemas
459
+ const ListCategoriesSchema = z.object({
460
+ project_slug: z
461
+ .string()
462
+ .optional()
463
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
464
+ });
465
+ // Team member schemas
466
+ const ListTeamMembersSchema = z.object({
467
+ project_slug: z
468
+ .string()
469
+ .optional()
470
+ .describe('Project slug (required for multi-project users, use list_projects to get slugs)'),
471
+ });
407
472
  // UUID v4 field names to remove from responses.
408
473
  // These are internal database IDs that agents should not use.
409
474
  // Agents should use refId (sequential int) or slug instead.
@@ -761,6 +826,58 @@ class WolfpackMCPServer {
761
826
  required: ['item_id'],
762
827
  },
763
828
  },
829
+ {
830
+ name: 'create_radar_item',
831
+ description: 'Create a new radar/initiative item in your current project. Requires mcp:radar:create permission. ' +
832
+ CONTENT_LINKING_HELP,
833
+ inputSchema: {
834
+ type: 'object',
835
+ properties: {
836
+ project_slug: {
837
+ type: 'string',
838
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
839
+ },
840
+ title: { type: 'string', description: 'Title of the radar/initiative item' },
841
+ description: {
842
+ type: 'string',
843
+ description: 'Description of the initiative (markdown)',
844
+ },
845
+ stage: {
846
+ type: 'string',
847
+ enum: ['pending', 'now', 'next', 'later', 'completed'],
848
+ description: 'Stage: "pending" (not started), "now" (current sprint), "next" (upcoming), "later" (future), "completed"',
849
+ },
850
+ },
851
+ required: ['title', 'stage'],
852
+ },
853
+ },
854
+ {
855
+ name: 'update_radar_item',
856
+ description: 'Update an existing radar/initiative item. Requires mcp:radar:update permission. ' +
857
+ CONTENT_LINKING_HELP,
858
+ inputSchema: {
859
+ type: 'object',
860
+ properties: {
861
+ item_id: {
862
+ type: 'string',
863
+ description: 'The refId (number) of the radar item to update',
864
+ },
865
+ title: { type: 'string', description: 'Updated title' },
866
+ description: { type: 'string', description: 'Updated description (markdown)' },
867
+ notes: { type: 'string', description: 'Updated internal notes (markdown)' },
868
+ stage: {
869
+ type: 'string',
870
+ enum: ['pending', 'now', 'next', 'later', 'completed'],
871
+ description: 'Updated stage',
872
+ },
873
+ project_slug: {
874
+ type: 'string',
875
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
876
+ },
877
+ },
878
+ required: ['item_id'],
879
+ },
880
+ },
764
881
  // Issue tools
765
882
  {
766
883
  name: 'list_issues',
@@ -953,11 +1070,22 @@ class WolfpackMCPServer {
953
1070
  enum: ['low', 'medium', 'high', 'critical'],
954
1071
  description: 'Updated severity',
955
1072
  },
1073
+ type: {
1074
+ type: 'string',
1075
+ enum: ['bug', 'feature-request', 'task', 'improvement', 'question'],
1076
+ description: 'Updated type',
1077
+ },
956
1078
  assigned_to_id: { type: 'string', description: 'Updated assignee' },
957
1079
  closing_note: {
958
1080
  type: 'string',
959
1081
  description: 'Closing note (when closing the issue)',
960
1082
  },
1083
+ environment: { type: 'string', description: 'Environment where the issue occurred' },
1084
+ affected_version: { type: 'string', description: 'Affected version' },
1085
+ reproducible: { type: 'boolean', description: 'Whether reproducible' },
1086
+ steps_to_reproduce: { type: 'string', description: 'Steps to reproduce' },
1087
+ expected_behavior: { type: 'string', description: 'Expected behavior' },
1088
+ actual_behavior: { type: 'string', description: 'Actual behavior' },
961
1089
  project_slug: {
962
1090
  type: 'string',
963
1091
  description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
@@ -1217,6 +1345,40 @@ class WolfpackMCPServer {
1217
1345
  required: ['issue_id', 'content'],
1218
1346
  },
1219
1347
  },
1348
+ {
1349
+ name: 'delete_work_item_comment',
1350
+ description: 'Delete a comment from a work item. Only the comment author can delete their own comments. ' +
1351
+ 'Requires mcp:comments:delete permission. Use list_work_item_comments to get comment IDs.',
1352
+ inputSchema: {
1353
+ type: 'object',
1354
+ properties: {
1355
+ work_item_id: { type: 'string', description: 'The work item refId (number)' },
1356
+ comment_id: { type: 'string', description: 'The comment ID to delete' },
1357
+ project_slug: {
1358
+ type: 'string',
1359
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1360
+ },
1361
+ },
1362
+ required: ['work_item_id', 'comment_id'],
1363
+ },
1364
+ },
1365
+ {
1366
+ name: 'delete_issue_comment',
1367
+ description: 'Delete a comment from an issue. Only the comment author can delete their own comments. ' +
1368
+ 'Requires mcp:comments:delete permission. Use list_issue_comments to get comment IDs.',
1369
+ inputSchema: {
1370
+ type: 'object',
1371
+ properties: {
1372
+ issue_id: { type: 'string', description: 'The issue refId (number)' },
1373
+ comment_id: { type: 'string', description: 'The comment ID to delete' },
1374
+ project_slug: {
1375
+ type: 'string',
1376
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1377
+ },
1378
+ },
1379
+ required: ['issue_id', 'comment_id'],
1380
+ },
1381
+ },
1220
1382
  // Image tools
1221
1383
  {
1222
1384
  name: 'upload_image',
@@ -1260,6 +1422,36 @@ class WolfpackMCPServer {
1260
1422
  required: ['image_url'],
1261
1423
  },
1262
1424
  },
1425
+ // Category tools
1426
+ {
1427
+ name: 'list_categories',
1428
+ description: 'List all categories available in a project. Returns category IDs, names, and descriptions. ' +
1429
+ 'Use this to look up category IDs by name when creating or updating work items.',
1430
+ inputSchema: {
1431
+ type: 'object',
1432
+ properties: {
1433
+ project_slug: {
1434
+ type: 'string',
1435
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1436
+ },
1437
+ },
1438
+ },
1439
+ },
1440
+ // Team member tools
1441
+ {
1442
+ name: 'list_team_members',
1443
+ description: 'List all members in a project/team. Returns user IDs, names, usernames, roles, and whether the member is an agent. ' +
1444
+ 'Use this to look up user IDs when assigning work items or issues.',
1445
+ inputSchema: {
1446
+ type: 'object',
1447
+ properties: {
1448
+ project_slug: {
1449
+ type: 'string',
1450
+ description: 'Project slug (required for multi-project users, use list_projects to get slugs)',
1451
+ },
1452
+ },
1453
+ },
1454
+ },
1263
1455
  // Skill tools (progressive disclosure)
1264
1456
  {
1265
1457
  name: 'list_skills',
@@ -1526,6 +1718,41 @@ class WolfpackMCPServer {
1526
1718
  content: [{ type: 'text', text: 'Radar item not found' }],
1527
1719
  };
1528
1720
  }
1721
+ case 'create_radar_item': {
1722
+ const parsed = CreateRadarItemSchema.parse(args);
1723
+ const radarItem = await this.client.createRadarItem({
1724
+ title: parsed.title,
1725
+ description: parsed.description,
1726
+ stage: parsed.stage,
1727
+ teamSlug: parsed.project_slug || this.client.getProjectSlug() || undefined,
1728
+ });
1729
+ return {
1730
+ content: [
1731
+ {
1732
+ type: 'text',
1733
+ text: `Created radar item #${radarItem.refId}: ${radarItem.title}\n\n${JSON.stringify(stripUuids(radarItem), null, 2)}`,
1734
+ },
1735
+ ],
1736
+ };
1737
+ }
1738
+ case 'update_radar_item': {
1739
+ const parsed = UpdateRadarItemSchema.parse(args);
1740
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
1741
+ const radarItem = await this.client.updateRadarItem(parsed.item_id, {
1742
+ title: parsed.title,
1743
+ description: parsed.description,
1744
+ notes: parsed.notes,
1745
+ stage: parsed.stage,
1746
+ }, teamSlug);
1747
+ return {
1748
+ content: [
1749
+ {
1750
+ type: 'text',
1751
+ text: `Updated radar item #${radarItem.refId}: ${radarItem.title}\n\n${JSON.stringify(stripUuids(radarItem), null, 2)}`,
1752
+ },
1753
+ ],
1754
+ };
1755
+ }
1529
1756
  // Issue handlers
1530
1757
  case 'list_issues': {
1531
1758
  const parsed = ListIssuesSchema.parse(args);
@@ -1619,8 +1846,15 @@ class WolfpackMCPServer {
1619
1846
  description: parsed.description,
1620
1847
  status: parsed.status,
1621
1848
  severity: parsed.severity,
1849
+ type: parsed.type,
1622
1850
  assignedToId: parsed.assigned_to_id,
1623
1851
  closingNote: parsed.closing_note,
1852
+ environment: parsed.environment,
1853
+ affectedVersion: parsed.affected_version,
1854
+ reproducible: parsed.reproducible,
1855
+ stepsToReproduce: parsed.steps_to_reproduce,
1856
+ expectedBehavior: parsed.expected_behavior,
1857
+ actualBehavior: parsed.actual_behavior,
1624
1858
  }, teamSlug);
1625
1859
  return {
1626
1860
  content: [
@@ -1805,6 +2039,32 @@ class WolfpackMCPServer {
1805
2039
  ],
1806
2040
  };
1807
2041
  }
2042
+ case 'delete_work_item_comment': {
2043
+ const parsed = DeleteWorkItemCommentSchema.parse(args);
2044
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
2045
+ await this.client.deleteWorkItemComment(parsed.work_item_id, parsed.comment_id, teamSlug);
2046
+ return {
2047
+ content: [
2048
+ {
2049
+ type: 'text',
2050
+ text: 'Comment deleted successfully',
2051
+ },
2052
+ ],
2053
+ };
2054
+ }
2055
+ case 'delete_issue_comment': {
2056
+ const parsed = DeleteIssueCommentSchema.parse(args);
2057
+ const teamSlug = parsed.project_slug || this.client.getProjectSlug() || undefined;
2058
+ await this.client.deleteIssueComment(parsed.issue_id, parsed.comment_id, teamSlug);
2059
+ return {
2060
+ content: [
2061
+ {
2062
+ type: 'text',
2063
+ text: 'Comment deleted successfully',
2064
+ },
2065
+ ],
2066
+ };
2067
+ }
1808
2068
  case 'upload_image': {
1809
2069
  const parsed = UploadImageSchema.parse(args);
1810
2070
  const teamSlug = await this.client.resolveSlug(parsed.project_slug || this.client.getProjectSlug() || undefined);
@@ -1873,6 +2133,22 @@ class WolfpackMCPServer {
1873
2133
  ],
1874
2134
  };
1875
2135
  }
2136
+ // Category handlers
2137
+ case 'list_categories': {
2138
+ const parsed = ListCategoriesSchema.parse(args);
2139
+ const categories = await this.client.listCategories(parsed.project_slug || this.client.getProjectSlug() || undefined);
2140
+ return {
2141
+ content: [{ type: 'text', text: JSON.stringify(categories, null, 2) }],
2142
+ };
2143
+ }
2144
+ // Team member handlers
2145
+ case 'list_team_members': {
2146
+ const parsed = ListTeamMembersSchema.parse(args);
2147
+ const members = await this.client.listTeamMembers(parsed.project_slug || this.client.getProjectSlug() || undefined);
2148
+ return {
2149
+ content: [{ type: 'text', text: JSON.stringify(members, null, 2) }],
2150
+ };
2151
+ }
1876
2152
  // Skill handlers
1877
2153
  case 'list_skills': {
1878
2154
  const skills = await this.client.listSkills();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wolfpack-mcp",
3
- "version": "1.0.43",
3
+ "version": "1.0.44",
4
4
  "description": "MCP server for Wolfpack AI-enhanced software delivery tools",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",