@ecubelabs/atlassian-mcp 1.2.0-next.4 → 1.2.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.
- package/dist/config.js +4 -4
- package/dist/index.js +426 -532
- package/dist/libs/base-client.js +13 -13
- package/dist/libs/error-handler.js +4 -4
- package/dist/libs/jira-client.js +53 -53
- package/package.json +3 -4
package/dist/libs/base-client.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import axios from
|
|
2
|
-
import axiosRetry from
|
|
3
|
-
import pLimit from
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import axiosRetry from 'axios-retry';
|
|
3
|
+
import pLimit from 'p-limit';
|
|
4
4
|
/**
|
|
5
5
|
* 기본적인 API Token 관리, 인터셉터, rate limit/retry 관리, 에러메세지 핸들링 등 Jira/Confluence 공통으로 필요한 기능을 제공하는 베이스 클래스
|
|
6
6
|
*/
|
|
@@ -18,13 +18,13 @@ export class BaseApiService {
|
|
|
18
18
|
this.setupRetry();
|
|
19
19
|
}
|
|
20
20
|
setupAxiosClient() {
|
|
21
|
-
const auth = Buffer.from(`${this.config.email}:${this.config.apiToken}`).toString(
|
|
21
|
+
const auth = Buffer.from(`${this.config.email}:${this.config.apiToken}`).toString('base64');
|
|
22
22
|
return axios.create({
|
|
23
23
|
baseURL: `${this.config.host}/rest/api/${this.config.apiVersion}`,
|
|
24
24
|
headers: {
|
|
25
25
|
Authorization: `Basic ${auth}`,
|
|
26
|
-
Accept:
|
|
27
|
-
|
|
26
|
+
Accept: 'application/json',
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
28
|
},
|
|
29
29
|
timeout: 30000,
|
|
30
30
|
});
|
|
@@ -60,11 +60,11 @@ export class BaseApiService {
|
|
|
60
60
|
const errorMessage = this.extractErrorMessage(response);
|
|
61
61
|
switch (response.status) {
|
|
62
62
|
case 401:
|
|
63
|
-
throw new Error(
|
|
63
|
+
throw new Error('Authentication failed');
|
|
64
64
|
case 403:
|
|
65
|
-
throw new Error(
|
|
65
|
+
throw new Error('Permission denied');
|
|
66
66
|
case 404:
|
|
67
|
-
throw new Error(
|
|
67
|
+
throw new Error('Resource not found');
|
|
68
68
|
case 429:
|
|
69
69
|
throw error;
|
|
70
70
|
default:
|
|
@@ -72,20 +72,20 @@ export class BaseApiService {
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
else {
|
|
75
|
-
throw new Error(
|
|
75
|
+
throw new Error('Network error occurred');
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
extractErrorMessage(response) {
|
|
79
79
|
if (response.data?.errorMessages) {
|
|
80
|
-
return response.data.errorMessages.join(
|
|
80
|
+
return response.data.errorMessages.join(', ');
|
|
81
81
|
}
|
|
82
82
|
if (response.data?.errors) {
|
|
83
|
-
return Object.values(response.data.errors).join(
|
|
83
|
+
return Object.values(response.data.errors).join(', ');
|
|
84
84
|
}
|
|
85
85
|
if (response.data?.message) {
|
|
86
86
|
return response.data.message;
|
|
87
87
|
}
|
|
88
|
-
return
|
|
88
|
+
return 'Unknown error occurred';
|
|
89
89
|
}
|
|
90
90
|
// Rate limited request wrapper
|
|
91
91
|
async makeRequest(requestFn) {
|
|
@@ -5,17 +5,17 @@ export class ApiError extends Error {
|
|
|
5
5
|
super(message);
|
|
6
6
|
this.statusCode = statusCode;
|
|
7
7
|
this.details = details;
|
|
8
|
-
this.name =
|
|
8
|
+
this.name = 'ApiError';
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
11
|
export function handleApiError(error) {
|
|
12
12
|
if (error.response) {
|
|
13
|
-
throw new ApiError(error.response.data?.message ||
|
|
13
|
+
throw new ApiError(error.response.data?.message || 'API request failed', error.response.status, error.response.data);
|
|
14
14
|
}
|
|
15
15
|
else if (error.request) {
|
|
16
|
-
throw new ApiError(
|
|
16
|
+
throw new ApiError('No response received from server');
|
|
17
17
|
}
|
|
18
18
|
else {
|
|
19
|
-
throw new ApiError(error.message ||
|
|
19
|
+
throw new ApiError(error.message || 'Unknown error occurred');
|
|
20
20
|
}
|
|
21
21
|
}
|
package/dist/libs/jira-client.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { markdownToAdf } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { markdownToAdf } from 'marklassian';
|
|
2
|
+
import { atlassianConfig } from '../config.js';
|
|
3
|
+
import { BaseApiService } from './base-client.js';
|
|
4
4
|
export class JiraService extends BaseApiService {
|
|
5
5
|
constructor() {
|
|
6
|
-
super(atlassianConfig.jira,
|
|
6
|
+
super(atlassianConfig.jira, 'JiraService');
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
9
|
* Issue 조회
|
|
@@ -11,7 +11,7 @@ export class JiraService extends BaseApiService {
|
|
|
11
11
|
*/
|
|
12
12
|
async getIssue(issueKey, expand) {
|
|
13
13
|
return this.makeRequest(() => this.client.get(`/issue/${issueKey}`, {
|
|
14
|
-
params: expand ? { expand: expand.join(
|
|
14
|
+
params: expand ? { expand: expand.join(',') } : undefined,
|
|
15
15
|
}));
|
|
16
16
|
}
|
|
17
17
|
/**
|
|
@@ -40,7 +40,7 @@ export class JiraService extends BaseApiService {
|
|
|
40
40
|
body.failFast = failFast;
|
|
41
41
|
if (reconcileIssues)
|
|
42
42
|
body.reconcileIssues = reconcileIssues;
|
|
43
|
-
const response = await this.makeRequest(() => this.client.post(
|
|
43
|
+
const response = await this.makeRequest(() => this.client.post('/search/jql', body));
|
|
44
44
|
return {
|
|
45
45
|
issues: response.issues || [],
|
|
46
46
|
startAt: response.startAt,
|
|
@@ -65,9 +65,9 @@ export class JiraService extends BaseApiService {
|
|
|
65
65
|
if (orderBy)
|
|
66
66
|
params.orderBy = orderBy;
|
|
67
67
|
if (id)
|
|
68
|
-
params.id = id.join(
|
|
68
|
+
params.id = id.join(',');
|
|
69
69
|
if (keys)
|
|
70
|
-
params.keys = keys.join(
|
|
70
|
+
params.keys = keys.join(',');
|
|
71
71
|
if (query)
|
|
72
72
|
params.query = query;
|
|
73
73
|
if (typeKey)
|
|
@@ -77,19 +77,19 @@ export class JiraService extends BaseApiService {
|
|
|
77
77
|
if (action)
|
|
78
78
|
params.action = action;
|
|
79
79
|
if (expand)
|
|
80
|
-
params.expand = expand.join(
|
|
80
|
+
params.expand = expand.join(',');
|
|
81
81
|
if (status)
|
|
82
|
-
params.status = status.join(
|
|
82
|
+
params.status = status.join(',');
|
|
83
83
|
if (properties) {
|
|
84
84
|
// Handle the nested StringList structure
|
|
85
85
|
properties.forEach((prop, index) => {
|
|
86
|
-
params[`properties[${index}]`] = prop.join(
|
|
86
|
+
params[`properties[${index}]`] = prop.join(',');
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
89
|
if (propertyQuery)
|
|
90
90
|
params.propertyQuery = propertyQuery;
|
|
91
91
|
}
|
|
92
|
-
return this.makeRequest(() => this.client.get(
|
|
92
|
+
return this.makeRequest(() => this.client.get('/project/search', { params }));
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* 이슈 댓글 목록 조회
|
|
@@ -107,7 +107,7 @@ export class JiraService extends BaseApiService {
|
|
|
107
107
|
if (orderBy)
|
|
108
108
|
params.orderBy = orderBy;
|
|
109
109
|
if (expand)
|
|
110
|
-
params.expand = expand.join(
|
|
110
|
+
params.expand = expand.join(',');
|
|
111
111
|
}
|
|
112
112
|
return this.makeRequest(() => this.client.get(`/issue/${issueKey}/comment`, { params }));
|
|
113
113
|
}
|
|
@@ -144,16 +144,16 @@ export class JiraService extends BaseApiService {
|
|
|
144
144
|
if (maxResults !== undefined)
|
|
145
145
|
params.maxResults = maxResults;
|
|
146
146
|
}
|
|
147
|
-
return this.makeRequest(() => this.client.get(
|
|
147
|
+
return this.makeRequest(() => this.client.get('/field/search', { params }));
|
|
148
148
|
}
|
|
149
149
|
/**
|
|
150
150
|
* JQL 파싱 및 검증
|
|
151
151
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-jql/#api-rest-api-3-jql-parse-post
|
|
152
152
|
*/
|
|
153
153
|
async parseJql(query, validation) {
|
|
154
|
-
return this.makeRequest(() => this.client.post(
|
|
154
|
+
return this.makeRequest(() => this.client.post('/jql/parse', {
|
|
155
155
|
query,
|
|
156
|
-
validation: validation ||
|
|
156
|
+
validation: validation || 'strict',
|
|
157
157
|
}));
|
|
158
158
|
}
|
|
159
159
|
/**
|
|
@@ -192,7 +192,7 @@ export class JiraService extends BaseApiService {
|
|
|
192
192
|
if (options.additionalFields) {
|
|
193
193
|
Object.assign(fields, options.additionalFields);
|
|
194
194
|
}
|
|
195
|
-
return this.makeRequest(() => this.client.post(
|
|
195
|
+
return this.makeRequest(() => this.client.post('/issue', { fields }));
|
|
196
196
|
}
|
|
197
197
|
/**
|
|
198
198
|
* 이슈 담당자 변경
|
|
@@ -213,14 +213,14 @@ export class JiraService extends BaseApiService {
|
|
|
213
213
|
}
|
|
214
214
|
if (options.description) {
|
|
215
215
|
fields.description = {
|
|
216
|
-
type:
|
|
216
|
+
type: 'doc',
|
|
217
217
|
version: 1,
|
|
218
218
|
content: [
|
|
219
219
|
{
|
|
220
|
-
type:
|
|
220
|
+
type: 'paragraph',
|
|
221
221
|
content: [
|
|
222
222
|
{
|
|
223
|
-
type:
|
|
223
|
+
type: 'text',
|
|
224
224
|
text: options.description,
|
|
225
225
|
},
|
|
226
226
|
],
|
|
@@ -265,7 +265,7 @@ export class JiraService extends BaseApiService {
|
|
|
265
265
|
if (property)
|
|
266
266
|
params.property = property;
|
|
267
267
|
}
|
|
268
|
-
return this.makeRequest(() => this.client.get(
|
|
268
|
+
return this.makeRequest(() => this.client.get('/user/search', { params }));
|
|
269
269
|
}
|
|
270
270
|
/**
|
|
271
271
|
* 사용자 선택 자동완성
|
|
@@ -287,7 +287,7 @@ export class JiraService extends BaseApiService {
|
|
|
287
287
|
params.avatarSize = options.avatarSize;
|
|
288
288
|
if (options.excludeConnectUsers !== undefined)
|
|
289
289
|
params.excludeConnectUsers = options.excludeConnectUsers;
|
|
290
|
-
return this.makeRequest(() => this.client.get(
|
|
290
|
+
return this.makeRequest(() => this.client.get('/user/picker', { params }));
|
|
291
291
|
}
|
|
292
292
|
/**
|
|
293
293
|
* 할당 가능한 사용자 검색
|
|
@@ -296,7 +296,7 @@ export class JiraService extends BaseApiService {
|
|
|
296
296
|
async searchAssignableUsers(options) {
|
|
297
297
|
const params = {};
|
|
298
298
|
if (options.projectKeys)
|
|
299
|
-
params.projectKeys = options.projectKeys.join(
|
|
299
|
+
params.projectKeys = options.projectKeys.join(',');
|
|
300
300
|
if (options.query)
|
|
301
301
|
params.query = options.query;
|
|
302
302
|
if (options.username)
|
|
@@ -307,7 +307,7 @@ export class JiraService extends BaseApiService {
|
|
|
307
307
|
params.startAt = options.startAt;
|
|
308
308
|
if (options.maxResults !== undefined)
|
|
309
309
|
params.maxResults = options.maxResults;
|
|
310
|
-
return this.makeRequest(() => this.client.get(
|
|
310
|
+
return this.makeRequest(() => this.client.get('/user/assignable/search', { params }));
|
|
311
311
|
}
|
|
312
312
|
/**
|
|
313
313
|
* 권한별 사용자 검색
|
|
@@ -331,7 +331,7 @@ export class JiraService extends BaseApiService {
|
|
|
331
331
|
params.startAt = options.startAt;
|
|
332
332
|
if (options.maxResults !== undefined)
|
|
333
333
|
params.maxResults = options.maxResults;
|
|
334
|
-
return this.makeRequest(() => this.client.get(
|
|
334
|
+
return this.makeRequest(() => this.client.get('/user/permission/search', { params }));
|
|
335
335
|
}
|
|
336
336
|
/**
|
|
337
337
|
* 현재 사용자 정보 조회
|
|
@@ -340,9 +340,9 @@ export class JiraService extends BaseApiService {
|
|
|
340
340
|
async getMyself(expand) {
|
|
341
341
|
const params = {};
|
|
342
342
|
if (expand) {
|
|
343
|
-
params.expand = expand.join(
|
|
343
|
+
params.expand = expand.join(',');
|
|
344
344
|
}
|
|
345
|
-
return this.makeRequest(() => this.client.get(
|
|
345
|
+
return this.makeRequest(() => this.client.get('/myself', { params }));
|
|
346
346
|
}
|
|
347
347
|
/**
|
|
348
348
|
* 현재 사용자의 권한 조회
|
|
@@ -369,7 +369,7 @@ export class JiraService extends BaseApiService {
|
|
|
369
369
|
if (commentId)
|
|
370
370
|
params.commentId = commentId;
|
|
371
371
|
}
|
|
372
|
-
return this.makeRequest(() => this.client.get(
|
|
372
|
+
return this.makeRequest(() => this.client.get('/mypermissions', { params }));
|
|
373
373
|
}
|
|
374
374
|
/**
|
|
375
375
|
* 현재 사용자 설정 업데이트
|
|
@@ -385,7 +385,7 @@ export class JiraService extends BaseApiService {
|
|
|
385
385
|
body.timeZone = options.timeZone;
|
|
386
386
|
if (options.locale)
|
|
387
387
|
body.locale = options.locale;
|
|
388
|
-
return this.makeRequest(() => this.client.put(
|
|
388
|
+
return this.makeRequest(() => this.client.put('/myself', body));
|
|
389
389
|
}
|
|
390
390
|
/**
|
|
391
391
|
* 현재 사용자의 설정 값 조회
|
|
@@ -396,7 +396,7 @@ export class JiraService extends BaseApiService {
|
|
|
396
396
|
if (key) {
|
|
397
397
|
params.key = key;
|
|
398
398
|
}
|
|
399
|
-
return this.makeRequest(() => this.client.get(
|
|
399
|
+
return this.makeRequest(() => this.client.get('/mypreferences', { params }));
|
|
400
400
|
}
|
|
401
401
|
/**
|
|
402
402
|
* 현재 사용자의 설정 값 업데이트
|
|
@@ -404,28 +404,28 @@ export class JiraService extends BaseApiService {
|
|
|
404
404
|
*/
|
|
405
405
|
async updateMyPreferences(key, value) {
|
|
406
406
|
const params = { key };
|
|
407
|
-
return this.makeRequest(() => this.client.put(
|
|
407
|
+
return this.makeRequest(() => this.client.put('/mypreferences', value, { params }));
|
|
408
408
|
}
|
|
409
409
|
/**
|
|
410
410
|
* 현재 사용자의 로케일 조회
|
|
411
411
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-myself/#api-rest-api-3-mypreferences-locale-get
|
|
412
412
|
*/
|
|
413
413
|
async getMyLocale() {
|
|
414
|
-
return this.makeRequest(() => this.client.get(
|
|
414
|
+
return this.makeRequest(() => this.client.get('/mypreferences/locale'));
|
|
415
415
|
}
|
|
416
416
|
/**
|
|
417
417
|
* 현재 사용자의 로케일 업데이트
|
|
418
418
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-myself/#api-rest-api-3-mypreferences-locale-put
|
|
419
419
|
*/
|
|
420
420
|
async updateMyLocale(locale) {
|
|
421
|
-
return this.makeRequest(() => this.client.put(
|
|
421
|
+
return this.makeRequest(() => this.client.put('/mypreferences/locale', { locale }));
|
|
422
422
|
}
|
|
423
423
|
/**
|
|
424
424
|
* 모든 우선순위 조회
|
|
425
425
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-priorities/#api-rest-api-3-priority-get
|
|
426
426
|
*/
|
|
427
427
|
async getPriorities() {
|
|
428
|
-
return this.makeRequest(() => this.client.get(
|
|
428
|
+
return this.makeRequest(() => this.client.get('/priority'));
|
|
429
429
|
}
|
|
430
430
|
/**
|
|
431
431
|
* 특정 우선순위 조회
|
|
@@ -447,15 +447,15 @@ export class JiraService extends BaseApiService {
|
|
|
447
447
|
if (maxResults !== undefined)
|
|
448
448
|
params.maxResults = maxResults;
|
|
449
449
|
if (id)
|
|
450
|
-
params.id = id.join(
|
|
450
|
+
params.id = id.join(',');
|
|
451
451
|
if (projectId)
|
|
452
|
-
params.projectId = projectId.join(
|
|
452
|
+
params.projectId = projectId.join(',');
|
|
453
453
|
if (priorityName)
|
|
454
454
|
params.priorityName = priorityName;
|
|
455
455
|
if (onlyDefault !== undefined)
|
|
456
456
|
params.onlyDefault = onlyDefault;
|
|
457
457
|
}
|
|
458
|
-
return this.makeRequest(() => this.client.get(
|
|
458
|
+
return this.makeRequest(() => this.client.get('/priority/search', { params }));
|
|
459
459
|
}
|
|
460
460
|
/**
|
|
461
461
|
* 이슈의 가능한 전환 조회
|
|
@@ -464,7 +464,7 @@ export class JiraService extends BaseApiService {
|
|
|
464
464
|
async getIssueTransitions(issueKey, expand) {
|
|
465
465
|
const params = {};
|
|
466
466
|
if (expand) {
|
|
467
|
-
params.expand = expand.join(
|
|
467
|
+
params.expand = expand.join(',');
|
|
468
468
|
}
|
|
469
469
|
return this.makeRequest(() => this.client.get(`/issue/${issueKey}/transitions`, { params }));
|
|
470
470
|
}
|
|
@@ -482,14 +482,14 @@ export class JiraService extends BaseApiService {
|
|
|
482
482
|
{
|
|
483
483
|
add: {
|
|
484
484
|
body: {
|
|
485
|
-
type:
|
|
485
|
+
type: 'doc',
|
|
486
486
|
version: 1,
|
|
487
487
|
content: [
|
|
488
488
|
{
|
|
489
|
-
type:
|
|
489
|
+
type: 'paragraph',
|
|
490
490
|
content: [
|
|
491
491
|
{
|
|
492
|
-
type:
|
|
492
|
+
type: 'text',
|
|
493
493
|
text: options.comment.body,
|
|
494
494
|
},
|
|
495
495
|
],
|
|
@@ -522,7 +522,7 @@ export class JiraService extends BaseApiService {
|
|
|
522
522
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-workflow-statuses/#api-rest-api-3-status-get
|
|
523
523
|
*/
|
|
524
524
|
async getStatuses() {
|
|
525
|
-
return this.makeRequest(() => this.client.get(
|
|
525
|
+
return this.makeRequest(() => this.client.get('/status'));
|
|
526
526
|
}
|
|
527
527
|
/**
|
|
528
528
|
* 특정 상태 조회
|
|
@@ -550,7 +550,7 @@ export class JiraService extends BaseApiService {
|
|
|
550
550
|
if (expand)
|
|
551
551
|
params.expand = expand;
|
|
552
552
|
}
|
|
553
|
-
return this.makeRequest(() => this.client.get(
|
|
553
|
+
return this.makeRequest(() => this.client.get('/statuses/search', { params }));
|
|
554
554
|
}
|
|
555
555
|
/**
|
|
556
556
|
* 이슈에 댓글 추가
|
|
@@ -575,14 +575,14 @@ export class JiraService extends BaseApiService {
|
|
|
575
575
|
async updateComment(issueKey, commentId, options) {
|
|
576
576
|
const body = {
|
|
577
577
|
body: {
|
|
578
|
-
type:
|
|
578
|
+
type: 'doc',
|
|
579
579
|
version: 1,
|
|
580
580
|
content: [
|
|
581
581
|
{
|
|
582
|
-
type:
|
|
582
|
+
type: 'paragraph',
|
|
583
583
|
content: [
|
|
584
584
|
{
|
|
585
|
-
type:
|
|
585
|
+
type: 'text',
|
|
586
586
|
text: options.body,
|
|
587
587
|
},
|
|
588
588
|
],
|
|
@@ -621,7 +621,7 @@ export class JiraService extends BaseApiService {
|
|
|
621
621
|
* @see https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issue-link-types/#api-rest-api-3-issuelinktype-get
|
|
622
622
|
*/
|
|
623
623
|
async getIssueLinkTypes() {
|
|
624
|
-
return this.makeRequest(() => this.client.get(
|
|
624
|
+
return this.makeRequest(() => this.client.get('/issueLinkType'));
|
|
625
625
|
}
|
|
626
626
|
/**
|
|
627
627
|
* 특정 이슈 링크 타입 조회
|
|
@@ -643,14 +643,14 @@ export class JiraService extends BaseApiService {
|
|
|
643
643
|
if (options.comment) {
|
|
644
644
|
body.comment = {
|
|
645
645
|
body: {
|
|
646
|
-
type:
|
|
646
|
+
type: 'doc',
|
|
647
647
|
version: 1,
|
|
648
648
|
content: [
|
|
649
649
|
{
|
|
650
|
-
type:
|
|
650
|
+
type: 'paragraph',
|
|
651
651
|
content: [
|
|
652
652
|
{
|
|
653
|
-
type:
|
|
653
|
+
type: 'text',
|
|
654
654
|
text: options.comment.body,
|
|
655
655
|
},
|
|
656
656
|
],
|
|
@@ -662,7 +662,7 @@ export class JiraService extends BaseApiService {
|
|
|
662
662
|
}),
|
|
663
663
|
};
|
|
664
664
|
}
|
|
665
|
-
return this.makeRequest(() => this.client.post(
|
|
665
|
+
return this.makeRequest(() => this.client.post('/issueLink', body));
|
|
666
666
|
}
|
|
667
667
|
/**
|
|
668
668
|
* 이슈 링크 조회
|
|
@@ -683,7 +683,7 @@ export class JiraService extends BaseApiService {
|
|
|
683
683
|
*/
|
|
684
684
|
async getIssueWithLinks(issueKey) {
|
|
685
685
|
return this.makeRequest(() => this.client.get(`/issue/${issueKey}`, {
|
|
686
|
-
params: { fields:
|
|
686
|
+
params: { fields: '*all', expand: 'issuelinks' },
|
|
687
687
|
}));
|
|
688
688
|
}
|
|
689
689
|
/**
|
|
@@ -700,7 +700,7 @@ export class JiraService extends BaseApiService {
|
|
|
700
700
|
async addWatcher(issueKey, accountId) {
|
|
701
701
|
return this.makeRequest(() => this.client.post(`/issue/${issueKey}/watchers`, `"${accountId}"`, {
|
|
702
702
|
headers: {
|
|
703
|
-
|
|
703
|
+
'Content-Type': 'application/json',
|
|
704
704
|
},
|
|
705
705
|
}));
|
|
706
706
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ecubelabs/atlassian-mcp",
|
|
3
|
-
"version": "1.2.0
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"bin": "./dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/Ecube-Labs/skynet.git"
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"type": "module",
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@modelcontextprotocol/sdk": "^1.17.3",
|
|
23
|
-
"axios": "^1.
|
|
23
|
+
"axios": "^1.12.0",
|
|
24
24
|
"axios-retry": "^4.5.0",
|
|
25
25
|
"dotenv": "^17.2.0",
|
|
26
26
|
"marklassian": "^1.1.0",
|
|
@@ -37,6 +37,5 @@
|
|
|
37
37
|
"semantic-release-yarn": "^3.0.2",
|
|
38
38
|
"ts-node": "^10.9.2",
|
|
39
39
|
"typescript": "^5.8.2"
|
|
40
|
-
}
|
|
41
|
-
"stableVersion": "1.0.0"
|
|
40
|
+
}
|
|
42
41
|
}
|