@dobbyai/mcp-external 1.0.2 → 1.0.4
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/README.md +67 -14
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/index.d.ts +246 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +34 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/jira.d.ts +437 -0
- package/dist/tools/jira.d.ts.map +1 -0
- package/dist/tools/jira.js +628 -0
- package/dist/tools/jira.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,628 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira Cloud Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for interacting with Jira Cloud through the Dobby gateway proxy.
|
|
5
|
+
* All calls go through /api/v1/gateway/agents/proxy which handles:
|
|
6
|
+
* - credential decryption (Basic Auth: email + API token)
|
|
7
|
+
* - connection lookup per tenant
|
|
8
|
+
* - request forwarding to Jira REST API v3
|
|
9
|
+
* - ADF wrapping for descriptions and comments
|
|
10
|
+
* - rate limit (429) handling with Retry-After
|
|
11
|
+
*
|
|
12
|
+
* Jira API docs: https://developer.atlassian.com/cloud/jira/platform/rest/v3/
|
|
13
|
+
*/
|
|
14
|
+
// ============================================
|
|
15
|
+
// Tool Definitions
|
|
16
|
+
// ============================================
|
|
17
|
+
export const jiraTools = {
|
|
18
|
+
jira_search_issues: {
|
|
19
|
+
name: 'jira_search_issues',
|
|
20
|
+
description: 'Search for Jira issues using JQL (Jira Query Language). Returns matching issues with summary, status, assignee, and priority. Supports cursor-based pagination.',
|
|
21
|
+
inputSchema: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: {
|
|
24
|
+
jql: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'JQL query string (e.g., "project = PROJ AND status = Open", "assignee = currentUser() ORDER BY updated DESC")',
|
|
27
|
+
},
|
|
28
|
+
max_results: {
|
|
29
|
+
type: 'number',
|
|
30
|
+
description: 'Maximum results per page (default: 20, max: 100)',
|
|
31
|
+
},
|
|
32
|
+
next_page_token: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'Pagination token from a previous search response to get the next page',
|
|
35
|
+
},
|
|
36
|
+
connection_id: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Optional: specific Jira connection ID. If omitted, uses the first active Jira connection.',
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
required: ['jql'],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
jira_get_issue: {
|
|
45
|
+
name: 'jira_get_issue',
|
|
46
|
+
description: 'Get detailed information about a specific Jira issue by its key (e.g., PROJ-123). Returns summary, status, priority, assignee, description, and more.',
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
properties: {
|
|
50
|
+
issue_key: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'Jira issue key (e.g., "PROJ-123", "DEV-456")',
|
|
53
|
+
},
|
|
54
|
+
connection_id: {
|
|
55
|
+
type: 'string',
|
|
56
|
+
description: 'Optional: specific Jira connection ID.',
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
required: ['issue_key'],
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
jira_create_issue: {
|
|
63
|
+
name: 'jira_create_issue',
|
|
64
|
+
description: 'Create a new Jira issue. Requires project key and summary. Plain text descriptions are automatically converted to Atlassian Document Format (ADF).',
|
|
65
|
+
inputSchema: {
|
|
66
|
+
type: 'object',
|
|
67
|
+
properties: {
|
|
68
|
+
project_key: {
|
|
69
|
+
type: 'string',
|
|
70
|
+
description: 'Project key where the issue will be created (e.g., "PROJ")',
|
|
71
|
+
},
|
|
72
|
+
summary: {
|
|
73
|
+
type: 'string',
|
|
74
|
+
description: 'Issue title/summary',
|
|
75
|
+
},
|
|
76
|
+
description: {
|
|
77
|
+
type: 'string',
|
|
78
|
+
description: 'Issue description (plain text — auto-converted to ADF)',
|
|
79
|
+
},
|
|
80
|
+
issue_type: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Issue type name (e.g., "Task", "Bug", "Story", "Epic"). Default: "Task"',
|
|
83
|
+
},
|
|
84
|
+
priority: {
|
|
85
|
+
type: 'string',
|
|
86
|
+
description: 'Priority name (e.g., "Highest", "High", "Medium", "Low", "Lowest")',
|
|
87
|
+
},
|
|
88
|
+
labels: {
|
|
89
|
+
type: 'array',
|
|
90
|
+
items: { type: 'string' },
|
|
91
|
+
description: 'Labels to add to the issue',
|
|
92
|
+
},
|
|
93
|
+
connection_id: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'Optional: specific Jira connection ID.',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
required: ['project_key', 'summary'],
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
jira_update_issue: {
|
|
102
|
+
name: 'jira_update_issue',
|
|
103
|
+
description: 'Update fields on an existing Jira issue. Only send the fields you want to change. Plain text descriptions are automatically converted to ADF.',
|
|
104
|
+
inputSchema: {
|
|
105
|
+
type: 'object',
|
|
106
|
+
properties: {
|
|
107
|
+
issue_key: {
|
|
108
|
+
type: 'string',
|
|
109
|
+
description: 'Issue key to update (e.g., "PROJ-123")',
|
|
110
|
+
},
|
|
111
|
+
summary: {
|
|
112
|
+
type: 'string',
|
|
113
|
+
description: 'New summary/title',
|
|
114
|
+
},
|
|
115
|
+
description: {
|
|
116
|
+
type: 'string',
|
|
117
|
+
description: 'New description (plain text — auto-converted to ADF)',
|
|
118
|
+
},
|
|
119
|
+
priority: {
|
|
120
|
+
type: 'string',
|
|
121
|
+
description: 'New priority name',
|
|
122
|
+
},
|
|
123
|
+
labels: {
|
|
124
|
+
type: 'array',
|
|
125
|
+
items: { type: 'string' },
|
|
126
|
+
description: 'New labels (replaces existing)',
|
|
127
|
+
},
|
|
128
|
+
connection_id: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'Optional: specific Jira connection ID.',
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
required: ['issue_key'],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
jira_add_comment: {
|
|
137
|
+
name: 'jira_add_comment',
|
|
138
|
+
description: 'Add a comment to a Jira issue. Plain text is automatically converted to Atlassian Document Format (ADF).',
|
|
139
|
+
inputSchema: {
|
|
140
|
+
type: 'object',
|
|
141
|
+
properties: {
|
|
142
|
+
issue_key: {
|
|
143
|
+
type: 'string',
|
|
144
|
+
description: 'Issue key to comment on (e.g., "PROJ-123")',
|
|
145
|
+
},
|
|
146
|
+
comment_body: {
|
|
147
|
+
type: 'string',
|
|
148
|
+
description: 'Comment text (plain text — auto-converted to ADF)',
|
|
149
|
+
},
|
|
150
|
+
connection_id: {
|
|
151
|
+
type: 'string',
|
|
152
|
+
description: 'Optional: specific Jira connection ID.',
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
required: ['issue_key', 'comment_body'],
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
jira_get_comments: {
|
|
159
|
+
name: 'jira_get_comments',
|
|
160
|
+
description: 'Get comments on a Jira issue. Returns comment author, body, and timestamps.',
|
|
161
|
+
inputSchema: {
|
|
162
|
+
type: 'object',
|
|
163
|
+
properties: {
|
|
164
|
+
issue_key: {
|
|
165
|
+
type: 'string',
|
|
166
|
+
description: 'Issue key (e.g., "PROJ-123")',
|
|
167
|
+
},
|
|
168
|
+
max_results: {
|
|
169
|
+
type: 'number',
|
|
170
|
+
description: 'Maximum comments to return (default: 20)',
|
|
171
|
+
},
|
|
172
|
+
connection_id: {
|
|
173
|
+
type: 'string',
|
|
174
|
+
description: 'Optional: specific Jira connection ID.',
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
required: ['issue_key'],
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
jira_get_transitions: {
|
|
181
|
+
name: 'jira_get_transitions',
|
|
182
|
+
description: 'List available workflow transitions for a Jira issue. Use this to find the transition ID before calling jira_transition_issue.',
|
|
183
|
+
inputSchema: {
|
|
184
|
+
type: 'object',
|
|
185
|
+
properties: {
|
|
186
|
+
issue_key: {
|
|
187
|
+
type: 'string',
|
|
188
|
+
description: 'Issue key (e.g., "PROJ-123")',
|
|
189
|
+
},
|
|
190
|
+
connection_id: {
|
|
191
|
+
type: 'string',
|
|
192
|
+
description: 'Optional: specific Jira connection ID.',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
required: ['issue_key'],
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
jira_transition_issue: {
|
|
199
|
+
name: 'jira_transition_issue',
|
|
200
|
+
description: 'Transition a Jira issue to a new workflow status (e.g., "To Do" → "In Progress" → "Done"). Use jira_get_transitions first to find valid transition IDs.',
|
|
201
|
+
inputSchema: {
|
|
202
|
+
type: 'object',
|
|
203
|
+
properties: {
|
|
204
|
+
issue_key: {
|
|
205
|
+
type: 'string',
|
|
206
|
+
description: 'Issue key to transition (e.g., "PROJ-123")',
|
|
207
|
+
},
|
|
208
|
+
transition_id: {
|
|
209
|
+
type: 'string',
|
|
210
|
+
description: 'Transition ID (get from jira_get_transitions)',
|
|
211
|
+
},
|
|
212
|
+
connection_id: {
|
|
213
|
+
type: 'string',
|
|
214
|
+
description: 'Optional: specific Jira connection ID.',
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
required: ['issue_key', 'transition_id'],
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
jira_list_projects: {
|
|
221
|
+
name: 'jira_list_projects',
|
|
222
|
+
description: 'List Jira projects accessible to the authenticated user. Returns project key, name, and type.',
|
|
223
|
+
inputSchema: {
|
|
224
|
+
type: 'object',
|
|
225
|
+
properties: {
|
|
226
|
+
max_results: {
|
|
227
|
+
type: 'number',
|
|
228
|
+
description: 'Maximum projects to return (default: 50)',
|
|
229
|
+
},
|
|
230
|
+
connection_id: {
|
|
231
|
+
type: 'string',
|
|
232
|
+
description: 'Optional: specific Jira connection ID.',
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
},
|
|
237
|
+
jira_assign_issue: {
|
|
238
|
+
name: 'jira_assign_issue',
|
|
239
|
+
description: 'Assign or unassign a Jira issue. Provide the accountId of the assignee, or null to unassign.',
|
|
240
|
+
inputSchema: {
|
|
241
|
+
type: 'object',
|
|
242
|
+
properties: {
|
|
243
|
+
issue_key: {
|
|
244
|
+
type: 'string',
|
|
245
|
+
description: 'Issue key to assign (e.g., "PROJ-123")',
|
|
246
|
+
},
|
|
247
|
+
assignee_account_id: {
|
|
248
|
+
type: 'string',
|
|
249
|
+
description: 'Atlassian account ID of the new assignee. Pass null or omit to unassign.',
|
|
250
|
+
},
|
|
251
|
+
connection_id: {
|
|
252
|
+
type: 'string',
|
|
253
|
+
description: 'Optional: specific Jira connection ID.',
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
required: ['issue_key'],
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
async function callJiraGatewayProxy(client, payload) {
|
|
261
|
+
const url = `${client.apiUrl}/api/v1/gateway/agents/proxy`;
|
|
262
|
+
const response = await fetch(url, {
|
|
263
|
+
method: 'POST',
|
|
264
|
+
headers: {
|
|
265
|
+
'Content-Type': 'application/json',
|
|
266
|
+
Authorization: `Bearer ${client.apiKey}`,
|
|
267
|
+
...(client.tenantId ? { 'X-Tenant-Id': client.tenantId } : {}),
|
|
268
|
+
},
|
|
269
|
+
body: JSON.stringify(payload),
|
|
270
|
+
});
|
|
271
|
+
if (!response.ok) {
|
|
272
|
+
const errBody = await response.json().catch(() => ({
|
|
273
|
+
error: `Gateway proxy returned ${response.status}`,
|
|
274
|
+
}));
|
|
275
|
+
throw new Error(errBody.error ||
|
|
276
|
+
`Gateway proxy error: HTTP ${response.status}`);
|
|
277
|
+
}
|
|
278
|
+
return response.json();
|
|
279
|
+
}
|
|
280
|
+
// ============================================
|
|
281
|
+
// Tool Handlers
|
|
282
|
+
// ============================================
|
|
283
|
+
export async function handleJiraSearchIssues(client, args) {
|
|
284
|
+
try {
|
|
285
|
+
const data = await callJiraGatewayProxy(client, {
|
|
286
|
+
action: 'search_issues',
|
|
287
|
+
provider_id: 'jira',
|
|
288
|
+
jql: args.jql,
|
|
289
|
+
max_results: args.max_results,
|
|
290
|
+
next_page_token: args.next_page_token,
|
|
291
|
+
connection_id: args.connection_id,
|
|
292
|
+
});
|
|
293
|
+
const issues = data.response?.issues || [];
|
|
294
|
+
const total = data.response?.total || 0;
|
|
295
|
+
const nextPageToken = data.response?.nextPageToken;
|
|
296
|
+
let text = `# Jira Search Results\n\n`;
|
|
297
|
+
text += `**JQL:** \`${args.jql}\`\n`;
|
|
298
|
+
text += `**Total:** ${total} | **Showing:** ${issues.length}\n`;
|
|
299
|
+
text += `**Latency:** ${data.latency_ms}ms\n\n`;
|
|
300
|
+
if (issues.length > 0) {
|
|
301
|
+
text += `| Key | Summary | Status | Assignee | Priority |\n`;
|
|
302
|
+
text += `|-----|---------|--------|----------|----------|\n`;
|
|
303
|
+
for (const issue of issues) {
|
|
304
|
+
const f = issue.fields || {};
|
|
305
|
+
text += `| ${issue.key} | ${f.summary || 'N/A'} | ${f.status?.name || 'N/A'} | ${f.assignee?.displayName || 'Unassigned'} | ${f.priority?.name || 'N/A'} |\n`;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
text += `No issues found matching the query.\n`;
|
|
310
|
+
}
|
|
311
|
+
if (nextPageToken) {
|
|
312
|
+
text += `\n**Next page:** pass \`next_page_token: "${nextPageToken}"\` to get more results.`;
|
|
313
|
+
}
|
|
314
|
+
return { content: [{ type: 'text', text }] };
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
return {
|
|
318
|
+
content: [{ type: 'text', text: `Jira search failed: ${error.message}` }],
|
|
319
|
+
isError: true,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
export async function handleJiraGetIssue(client, args) {
|
|
324
|
+
try {
|
|
325
|
+
const data = await callJiraGatewayProxy(client, {
|
|
326
|
+
action: 'get_issue',
|
|
327
|
+
provider_id: 'jira',
|
|
328
|
+
issue_key: args.issue_key,
|
|
329
|
+
connection_id: args.connection_id,
|
|
330
|
+
});
|
|
331
|
+
const issue = data.response || {};
|
|
332
|
+
const f = issue.fields || {};
|
|
333
|
+
let text = `# ${args.issue_key}: ${f.summary || 'N/A'}\n\n`;
|
|
334
|
+
text += `- **Status:** ${f.status?.name || 'N/A'}\n`;
|
|
335
|
+
text += `- **Type:** ${f.issuetype?.name || 'N/A'}\n`;
|
|
336
|
+
text += `- **Priority:** ${f.priority?.name || 'N/A'}\n`;
|
|
337
|
+
text += `- **Assignee:** ${f.assignee?.displayName || 'Unassigned'}\n`;
|
|
338
|
+
text += `- **Reporter:** ${f.reporter?.displayName || 'N/A'}\n`;
|
|
339
|
+
text += `- **Labels:** ${(f.labels || []).join(', ') || 'None'}\n`;
|
|
340
|
+
text += `- **Created:** ${f.created || 'N/A'}\n`;
|
|
341
|
+
text += `- **Updated:** ${f.updated || 'N/A'}\n`;
|
|
342
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
343
|
+
// Extract plain text from ADF description if possible
|
|
344
|
+
if (f.description) {
|
|
345
|
+
text += `\n## Description\n\n`;
|
|
346
|
+
if (typeof f.description === 'string') {
|
|
347
|
+
text += f.description;
|
|
348
|
+
}
|
|
349
|
+
else if (f.description?.content) {
|
|
350
|
+
// Simplified ADF-to-text extraction
|
|
351
|
+
for (const block of f.description.content) {
|
|
352
|
+
if (block.type === 'paragraph' && block.content) {
|
|
353
|
+
for (const inline of block.content) {
|
|
354
|
+
if (inline.type === 'text')
|
|
355
|
+
text += inline.text;
|
|
356
|
+
if (inline.type === 'hardBreak')
|
|
357
|
+
text += '\n';
|
|
358
|
+
}
|
|
359
|
+
text += '\n';
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return { content: [{ type: 'text', text }] };
|
|
365
|
+
}
|
|
366
|
+
catch (error) {
|
|
367
|
+
return {
|
|
368
|
+
content: [{ type: 'text', text: `Failed to get Jira issue: ${error.message}` }],
|
|
369
|
+
isError: true,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
export async function handleJiraCreateIssue(client, args) {
|
|
374
|
+
try {
|
|
375
|
+
const issueFields = {
|
|
376
|
+
summary: args.summary,
|
|
377
|
+
};
|
|
378
|
+
if (args.description)
|
|
379
|
+
issueFields.description = args.description;
|
|
380
|
+
if (args.priority)
|
|
381
|
+
issueFields.priority = { name: args.priority };
|
|
382
|
+
if (args.labels)
|
|
383
|
+
issueFields.labels = args.labels;
|
|
384
|
+
const data = await callJiraGatewayProxy(client, {
|
|
385
|
+
action: 'create_issue',
|
|
386
|
+
provider_id: 'jira',
|
|
387
|
+
project_key: args.project_key,
|
|
388
|
+
issue_type: args.issue_type || 'Task',
|
|
389
|
+
issue_fields: issueFields,
|
|
390
|
+
connection_id: args.connection_id,
|
|
391
|
+
});
|
|
392
|
+
const issue = data.response || {};
|
|
393
|
+
let text = `# Jira Issue Created\n\n`;
|
|
394
|
+
text += `- **Key:** \`${issue.key}\`\n`;
|
|
395
|
+
text += `- **ID:** ${issue.id}\n`;
|
|
396
|
+
text += `- **Project:** ${args.project_key}\n`;
|
|
397
|
+
text += `- **Summary:** ${args.summary}\n`;
|
|
398
|
+
text += `- **Type:** ${args.issue_type || 'Task'}\n`;
|
|
399
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
400
|
+
if (issue.self) {
|
|
401
|
+
text += `\n**API URL:** ${issue.self}`;
|
|
402
|
+
}
|
|
403
|
+
return { content: [{ type: 'text', text }] };
|
|
404
|
+
}
|
|
405
|
+
catch (error) {
|
|
406
|
+
return {
|
|
407
|
+
content: [{ type: 'text', text: `Failed to create Jira issue: ${error.message}` }],
|
|
408
|
+
isError: true,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
export async function handleJiraUpdateIssue(client, args) {
|
|
413
|
+
try {
|
|
414
|
+
const issueFields = {};
|
|
415
|
+
if (args.summary)
|
|
416
|
+
issueFields.summary = args.summary;
|
|
417
|
+
if (args.description)
|
|
418
|
+
issueFields.description = args.description;
|
|
419
|
+
if (args.priority)
|
|
420
|
+
issueFields.priority = { name: args.priority };
|
|
421
|
+
if (args.labels)
|
|
422
|
+
issueFields.labels = args.labels;
|
|
423
|
+
const data = await callJiraGatewayProxy(client, {
|
|
424
|
+
action: 'update_issue',
|
|
425
|
+
provider_id: 'jira',
|
|
426
|
+
issue_key: args.issue_key,
|
|
427
|
+
issue_fields: issueFields,
|
|
428
|
+
connection_id: args.connection_id,
|
|
429
|
+
});
|
|
430
|
+
let text = `# Jira Issue Updated\n\n`;
|
|
431
|
+
text += `- **Issue:** \`${args.issue_key}\`\n`;
|
|
432
|
+
text += `- **Updated fields:** ${Object.keys(issueFields).join(', ')}\n`;
|
|
433
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
434
|
+
return { content: [{ type: 'text', text }] };
|
|
435
|
+
}
|
|
436
|
+
catch (error) {
|
|
437
|
+
return {
|
|
438
|
+
content: [{ type: 'text', text: `Failed to update Jira issue: ${error.message}` }],
|
|
439
|
+
isError: true,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
export async function handleJiraAddComment(client, args) {
|
|
444
|
+
try {
|
|
445
|
+
const data = await callJiraGatewayProxy(client, {
|
|
446
|
+
action: 'add_comment',
|
|
447
|
+
provider_id: 'jira',
|
|
448
|
+
issue_key: args.issue_key,
|
|
449
|
+
comment_body: args.comment_body,
|
|
450
|
+
connection_id: args.connection_id,
|
|
451
|
+
});
|
|
452
|
+
const comment = data.response || {};
|
|
453
|
+
let text = `# Comment Added\n\n`;
|
|
454
|
+
text += `- **Issue:** \`${args.issue_key}\`\n`;
|
|
455
|
+
text += `- **Comment ID:** ${comment.id || 'N/A'}\n`;
|
|
456
|
+
text += `- **Author:** ${comment.author?.displayName || 'N/A'}\n`;
|
|
457
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
458
|
+
return { content: [{ type: 'text', text }] };
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
return {
|
|
462
|
+
content: [{ type: 'text', text: `Failed to add comment: ${error.message}` }],
|
|
463
|
+
isError: true,
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
export async function handleJiraGetComments(client, args) {
|
|
468
|
+
try {
|
|
469
|
+
const data = await callJiraGatewayProxy(client, {
|
|
470
|
+
action: 'get_comments',
|
|
471
|
+
provider_id: 'jira',
|
|
472
|
+
issue_key: args.issue_key,
|
|
473
|
+
max_results: args.max_results,
|
|
474
|
+
connection_id: args.connection_id,
|
|
475
|
+
});
|
|
476
|
+
const comments = data.response?.comments || [];
|
|
477
|
+
const total = data.response?.total || 0;
|
|
478
|
+
let text = `# Comments on ${args.issue_key}\n\n`;
|
|
479
|
+
text += `**Total:** ${total} | **Showing:** ${comments.length}\n`;
|
|
480
|
+
text += `**Latency:** ${data.latency_ms}ms\n\n`;
|
|
481
|
+
if (comments.length > 0) {
|
|
482
|
+
for (const comment of comments) {
|
|
483
|
+
const author = comment.author?.displayName || 'Unknown';
|
|
484
|
+
const created = comment.created || 'N/A';
|
|
485
|
+
text += `### ${author} — ${created}\n`;
|
|
486
|
+
// Simplified ADF-to-text extraction for comment body
|
|
487
|
+
if (comment.body?.content) {
|
|
488
|
+
for (const block of comment.body.content) {
|
|
489
|
+
if (block.type === 'paragraph' && block.content) {
|
|
490
|
+
for (const inline of block.content) {
|
|
491
|
+
if (inline.type === 'text')
|
|
492
|
+
text += inline.text;
|
|
493
|
+
if (inline.type === 'hardBreak')
|
|
494
|
+
text += '\n';
|
|
495
|
+
}
|
|
496
|
+
text += '\n';
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
text += '\n';
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
text += `No comments found.\n`;
|
|
505
|
+
}
|
|
506
|
+
return { content: [{ type: 'text', text }] };
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
return {
|
|
510
|
+
content: [{ type: 'text', text: `Failed to get comments: ${error.message}` }],
|
|
511
|
+
isError: true,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
export async function handleJiraGetTransitions(client, args) {
|
|
516
|
+
try {
|
|
517
|
+
const data = await callJiraGatewayProxy(client, {
|
|
518
|
+
action: 'get_transitions',
|
|
519
|
+
provider_id: 'jira',
|
|
520
|
+
issue_key: args.issue_key,
|
|
521
|
+
connection_id: args.connection_id,
|
|
522
|
+
});
|
|
523
|
+
const transitions = data.response?.transitions || [];
|
|
524
|
+
let text = `# Available Transitions for ${args.issue_key}\n\n`;
|
|
525
|
+
text += `**Latency:** ${data.latency_ms}ms\n\n`;
|
|
526
|
+
if (transitions.length > 0) {
|
|
527
|
+
text += `| ID | Name | To Status |\n`;
|
|
528
|
+
text += `|----|------|-----------|\n`;
|
|
529
|
+
for (const t of transitions) {
|
|
530
|
+
text += `| ${t.id} | ${t.name} | ${t.to?.name || 'N/A'} |\n`;
|
|
531
|
+
}
|
|
532
|
+
text += `\nUse \`jira_transition_issue\` with the desired transition ID to change the issue status.`;
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
text += `No transitions available (the issue may already be in its final status).\n`;
|
|
536
|
+
}
|
|
537
|
+
return { content: [{ type: 'text', text }] };
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
return {
|
|
541
|
+
content: [{ type: 'text', text: `Failed to get transitions: ${error.message}` }],
|
|
542
|
+
isError: true,
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
export async function handleJiraTransitionIssue(client, args) {
|
|
547
|
+
try {
|
|
548
|
+
const data = await callJiraGatewayProxy(client, {
|
|
549
|
+
action: 'transition_issue',
|
|
550
|
+
provider_id: 'jira',
|
|
551
|
+
issue_key: args.issue_key,
|
|
552
|
+
transition_id: args.transition_id,
|
|
553
|
+
connection_id: args.connection_id,
|
|
554
|
+
});
|
|
555
|
+
let text = `# Issue Transitioned\n\n`;
|
|
556
|
+
text += `- **Issue:** \`${args.issue_key}\`\n`;
|
|
557
|
+
text += `- **Transition ID:** ${args.transition_id}\n`;
|
|
558
|
+
text += `- **Success:** ${data.success}\n`;
|
|
559
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
560
|
+
return { content: [{ type: 'text', text }] };
|
|
561
|
+
}
|
|
562
|
+
catch (error) {
|
|
563
|
+
return {
|
|
564
|
+
content: [{ type: 'text', text: `Failed to transition issue: ${error.message}` }],
|
|
565
|
+
isError: true,
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
export async function handleJiraListProjects(client, args) {
|
|
570
|
+
try {
|
|
571
|
+
const data = await callJiraGatewayProxy(client, {
|
|
572
|
+
action: 'list_projects',
|
|
573
|
+
provider_id: 'jira',
|
|
574
|
+
max_results: args.max_results,
|
|
575
|
+
connection_id: args.connection_id,
|
|
576
|
+
});
|
|
577
|
+
const projects = Array.isArray(data.response) ? data.response : [];
|
|
578
|
+
let text = `# Jira Projects\n\n`;
|
|
579
|
+
text += `**Projects Found:** ${projects.length}\n`;
|
|
580
|
+
text += `**Latency:** ${data.latency_ms}ms\n\n`;
|
|
581
|
+
if (projects.length > 0) {
|
|
582
|
+
text += `| Key | Name | Type | Style |\n`;
|
|
583
|
+
text += `|-----|------|------|-------|\n`;
|
|
584
|
+
for (const p of projects) {
|
|
585
|
+
text += `| ${p.key} | ${p.name} | ${p.projectTypeKey || 'N/A'} | ${p.style || 'N/A'} |\n`;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
text += `No projects found.\n`;
|
|
590
|
+
}
|
|
591
|
+
return { content: [{ type: 'text', text }] };
|
|
592
|
+
}
|
|
593
|
+
catch (error) {
|
|
594
|
+
return {
|
|
595
|
+
content: [{ type: 'text', text: `Failed to list projects: ${error.message}` }],
|
|
596
|
+
isError: true,
|
|
597
|
+
};
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
export async function handleJiraAssignIssue(client, args) {
|
|
601
|
+
try {
|
|
602
|
+
const data = await callJiraGatewayProxy(client, {
|
|
603
|
+
action: 'assign_issue',
|
|
604
|
+
provider_id: 'jira',
|
|
605
|
+
issue_key: args.issue_key,
|
|
606
|
+
assignee_account_id: args.assignee_account_id ?? null,
|
|
607
|
+
connection_id: args.connection_id,
|
|
608
|
+
});
|
|
609
|
+
const action = args.assignee_account_id ? 'Assigned' : 'Unassigned';
|
|
610
|
+
let text = `# Issue ${action}\n\n`;
|
|
611
|
+
text += `- **Issue:** \`${args.issue_key}\`\n`;
|
|
612
|
+
if (args.assignee_account_id) {
|
|
613
|
+
text += `- **Assignee Account ID:** ${args.assignee_account_id}\n`;
|
|
614
|
+
}
|
|
615
|
+
else {
|
|
616
|
+
text += `- **Assignee:** Unassigned\n`;
|
|
617
|
+
}
|
|
618
|
+
text += `- **Latency:** ${data.latency_ms}ms\n`;
|
|
619
|
+
return { content: [{ type: 'text', text }] };
|
|
620
|
+
}
|
|
621
|
+
catch (error) {
|
|
622
|
+
return {
|
|
623
|
+
content: [{ type: 'text', text: `Failed to assign issue: ${error.message}` }],
|
|
624
|
+
isError: true,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
//# sourceMappingURL=jira.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.js","sourceRoot":"","sources":["../../src/tools/jira.ts"],"names":[],"mappings":"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"}
|