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 +29 -0
- package/dist/index.js +276 -0
- package/package.json +1 -1
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();
|