@mcp-monorepo/jira 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.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/jira-env.d.ts +7 -0
- package/dist/lib/jira-env.d.ts.map +1 -0
- package/dist/lib/jira-env.js +17 -0
- package/dist/lib/jira-env.js.map +1 -0
- package/dist/lib/jira.service.d.ts +9 -0
- package/dist/lib/jira.service.d.ts.map +1 -0
- package/dist/lib/jira.service.js +61 -0
- package/dist/lib/jira.service.js.map +1 -0
- package/dist/lib/types.d.ts +56 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/tools/execute-jql.d.ts +3 -0
- package/dist/tools/execute-jql.d.ts.map +1 -0
- package/dist/tools/execute-jql.js +46 -0
- package/dist/tools/execute-jql.js.map +1 -0
- package/dist/tools/get-current-profile.d.ts +3 -0
- package/dist/tools/get-current-profile.d.ts.map +1 -0
- package/dist/tools/get-current-profile.js +26 -0
- package/dist/tools/get-current-profile.js.map +1 -0
- package/dist/tools/get-issue.d.ts +3 -0
- package/dist/tools/get-issue.d.ts.map +1 -0
- package/dist/tools/get-issue.js +34 -0
- package/dist/tools/get-issue.js.map +1 -0
- package/dist/tools/get-latest-projects.d.ts +3 -0
- package/dist/tools/get-latest-projects.d.ts.map +1 -0
- package/dist/tools/get-latest-projects.js +35 -0
- package/dist/tools/get-latest-projects.js.map +1 -0
- package/dist/tools/get-ticket-transitions.d.ts +3 -0
- package/dist/tools/get-ticket-transitions.d.ts.map +1 -0
- package/dist/tools/get-ticket-transitions.js +32 -0
- package/dist/tools/get-ticket-transitions.js.map +1 -0
- package/dist/tools/set-issue-status.d.ts +3 -0
- package/dist/tools/set-issue-status.d.ts.map +1 -0
- package/dist/tools/set-issue-status.js +36 -0
- package/dist/tools/set-issue-status.js.map +1 -0
- package/package.json +38 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createMcpServer, logger } from '@mcp-monorepo/shared';
|
|
3
|
+
import { registerExecuteJqlTool } from './tools/execute-jql.js';
|
|
4
|
+
import { registerGetCurrentProfileTool } from './tools/get-current-profile.js';
|
|
5
|
+
import { registerGetIssueTool } from './tools/get-issue.js';
|
|
6
|
+
import { registerGetLatestProjectsTool } from './tools/get-latest-projects.js';
|
|
7
|
+
import { registerGetTicketTransitionsTool } from './tools/get-ticket-transitions.js';
|
|
8
|
+
import { registerSetIssueStatusTool } from './tools/set-issue-status.js';
|
|
9
|
+
// Disable self-signed certificate errors if needed for local Jira instances
|
|
10
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
|
|
11
|
+
createMcpServer({
|
|
12
|
+
name: 'jira',
|
|
13
|
+
importMetaPath: import.meta.filename,
|
|
14
|
+
title: 'Jira MCP Server',
|
|
15
|
+
tools: [
|
|
16
|
+
registerGetCurrentProfileTool,
|
|
17
|
+
registerExecuteJqlTool,
|
|
18
|
+
registerGetLatestProjectsTool,
|
|
19
|
+
registerGetIssueTool,
|
|
20
|
+
registerSetIssueStatusTool,
|
|
21
|
+
registerGetTicketTransitionsTool,
|
|
22
|
+
],
|
|
23
|
+
}).catch((e) => logger.error('Failed to start Jira server', e));
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,mCAAmC,CAAA;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAExE,4EAA4E;AAC5E,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAA;AAE9C,eAAe,CAAC;IACd,IAAI,EAAE,MAAM;IACZ,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;IACpC,KAAK,EAAE,iBAAiB;IACxB,KAAK,EAAE;QACL,6BAA6B;QAC7B,sBAAsB;QACtB,6BAA6B;QAC7B,oBAAoB;QACpB,0BAA0B;QAC1B,gCAAgC;KACjC;CACF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira environment variable helpers
|
|
3
|
+
* Fetches JIRA_BASE_URL and JIRA_TOKEN from process.env and throws if missing.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getJiraBaseUrl(): string;
|
|
6
|
+
export declare function getJiraToken(): string;
|
|
7
|
+
//# sourceMappingURL=jira-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-env.d.ts","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAIrC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira environment variable helpers
|
|
3
|
+
* Fetches JIRA_BASE_URL and JIRA_TOKEN from process.env and throws if missing.
|
|
4
|
+
*/
|
|
5
|
+
export function getJiraBaseUrl() {
|
|
6
|
+
const url = process.env.JIRA_BASE_URL;
|
|
7
|
+
if (!url)
|
|
8
|
+
throw new Error('JIRA_BASE_URL env variable is required');
|
|
9
|
+
return url.replace(/\/$/, ''); // Remove trailing slash
|
|
10
|
+
}
|
|
11
|
+
export function getJiraToken() {
|
|
12
|
+
const token = process.env.JIRA_TOKEN;
|
|
13
|
+
if (!token)
|
|
14
|
+
throw new Error('JIRA_TOKEN env variable is required');
|
|
15
|
+
return token;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=jira-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-env.js","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAA;IACrC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IACnE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA,CAAC,wBAAwB;AACxD,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACpC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;IAClE,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { JiraIssue, JiraJqlResponse, JiraProfileResponse, JiraProjectsListResponse, JiraTransitionsResponse } from './types.js';
|
|
2
|
+
export declare const getIssue: (issueIdOrKey: string, fields?: string[], expand?: string[]) => Promise<JiraIssue>;
|
|
3
|
+
export declare const executeJql: (jql: string, maxResults?: number, startAt?: number, fields?: string[]) => Promise<JiraJqlResponse>;
|
|
4
|
+
export declare const getLatestProjects: (maxResults?: number) => Promise<JiraProjectsListResponse>;
|
|
5
|
+
export declare const getCurrentProfile: () => Promise<JiraProfileResponse>;
|
|
6
|
+
export declare const getTicketTransitions: (issueIdOrKey: string) => Promise<JiraTransitionsResponse>;
|
|
7
|
+
export declare const setIssueStatus: (issueIdOrKey: string, transitionId: string, comment?: string) => Promise<void>;
|
|
8
|
+
export declare const findTransitionIdByName: (issueIdOrKey: string, statusName: string) => Promise<string | undefined>;
|
|
9
|
+
//# sourceMappingURL=jira.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.service.d.ts","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AA2BnB,eAAO,MAAM,QAAQ,GAAI,cAAc,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,MAAM,EAAE,uBAKlF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,mBAAe,EAAE,gBAAW,EAAE,SAAS,MAAM,EAAE,6BAKtF,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,mBAAe,sCAEhD,CAAA;AAED,eAAO,MAAM,iBAAiB,oCAE7B,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,qCAExD,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,cAAc,MAAM,EAAE,cAAc,MAAM,EAAE,UAAU,MAAM,kBAShG,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAU,cAAc,MAAM,EAAE,YAAY,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAIjH,CAAA"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { getJiraBaseUrl, getJiraToken } from './jira-env.js';
|
|
2
|
+
async function jiraRequest(endpoint, options = {}) {
|
|
3
|
+
const url = new URL(endpoint, getJiraBaseUrl());
|
|
4
|
+
const response = await fetch(url.toString(), {
|
|
5
|
+
...options,
|
|
6
|
+
headers: {
|
|
7
|
+
Authorization: `Bearer ${getJiraToken()}`,
|
|
8
|
+
Accept: 'application/json',
|
|
9
|
+
'Content-Type': 'application/json',
|
|
10
|
+
...options.headers,
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
const errorText = await response.text();
|
|
15
|
+
throw new Error(`Jira API request failed with status ${response.status}: ${errorText}`);
|
|
16
|
+
}
|
|
17
|
+
// Handle cases like 204 No Content
|
|
18
|
+
if (response.status === 204) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return response.json();
|
|
22
|
+
}
|
|
23
|
+
export const getIssue = (issueIdOrKey, fields, expand) => {
|
|
24
|
+
const params = new URLSearchParams();
|
|
25
|
+
if (fields)
|
|
26
|
+
params.set('fields', fields.join(','));
|
|
27
|
+
if (expand)
|
|
28
|
+
params.set('expand', expand.join(','));
|
|
29
|
+
return jiraRequest(`/rest/api/2/issue/${issueIdOrKey}?${params.toString()}`);
|
|
30
|
+
};
|
|
31
|
+
export const executeJql = (jql, maxResults = 50, startAt = 0, fields) => {
|
|
32
|
+
return jiraRequest('/rest/api/2/search', {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
body: JSON.stringify({ jql, maxResults, startAt, fields: fields ?? ['summary', 'status', 'assignee'] }),
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
export const getLatestProjects = (maxResults = 10) => {
|
|
38
|
+
return jiraRequest(`/rest/api/2/project/search?orderBy=created&maxResults=${maxResults}`);
|
|
39
|
+
};
|
|
40
|
+
export const getCurrentProfile = () => {
|
|
41
|
+
return jiraRequest('/rest/api/2/myself');
|
|
42
|
+
};
|
|
43
|
+
export const getTicketTransitions = (issueIdOrKey) => {
|
|
44
|
+
return jiraRequest(`/rest/api/2/issue/${issueIdOrKey}/transitions`);
|
|
45
|
+
};
|
|
46
|
+
export const setIssueStatus = async (issueIdOrKey, transitionId, comment) => {
|
|
47
|
+
const body = { transition: { id: transitionId } };
|
|
48
|
+
if (comment) {
|
|
49
|
+
body.update = { comment: [{ add: { body: comment } }] };
|
|
50
|
+
}
|
|
51
|
+
await jiraRequest(`/rest/api/2/issue/${issueIdOrKey}/transitions`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
body: JSON.stringify(body),
|
|
54
|
+
});
|
|
55
|
+
};
|
|
56
|
+
export const findTransitionIdByName = async (issueIdOrKey, statusName) => {
|
|
57
|
+
const response = await getTicketTransitions(issueIdOrKey);
|
|
58
|
+
const transition = response.transitions.find((t) => t.to.name.toLowerCase() === statusName.toLowerCase());
|
|
59
|
+
return transition?.id;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=jira.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.service.js","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export interface JiraIssue {
|
|
2
|
+
id: string;
|
|
3
|
+
key: string;
|
|
4
|
+
fields: Record<string, unknown> & {
|
|
5
|
+
summary?: string;
|
|
6
|
+
status?: {
|
|
7
|
+
name?: string;
|
|
8
|
+
};
|
|
9
|
+
assignee?: {
|
|
10
|
+
displayName?: string;
|
|
11
|
+
};
|
|
12
|
+
description?: string;
|
|
13
|
+
};
|
|
14
|
+
expand?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface JiraJqlResponse {
|
|
17
|
+
expand?: string;
|
|
18
|
+
startAt: number;
|
|
19
|
+
maxResults: number;
|
|
20
|
+
total: number;
|
|
21
|
+
issues: JiraIssue[];
|
|
22
|
+
}
|
|
23
|
+
export interface JiraProject {
|
|
24
|
+
id: string;
|
|
25
|
+
key: string;
|
|
26
|
+
name: string;
|
|
27
|
+
projectTypeKey?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface JiraProjectsListResponse {
|
|
30
|
+
isLast?: boolean;
|
|
31
|
+
maxResults: number;
|
|
32
|
+
startAt: number;
|
|
33
|
+
total: number;
|
|
34
|
+
values: JiraProject[];
|
|
35
|
+
}
|
|
36
|
+
export interface JiraProfileResponse {
|
|
37
|
+
self: string;
|
|
38
|
+
key: string;
|
|
39
|
+
accountId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
emailAddress: string;
|
|
42
|
+
displayName: string;
|
|
43
|
+
}
|
|
44
|
+
export interface JiraTransition {
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
to: {
|
|
48
|
+
name: string;
|
|
49
|
+
id: string;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export interface JiraTransitionsResponse {
|
|
53
|
+
expand?: string;
|
|
54
|
+
transitions: JiraTransition[];
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAChC,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC1B,QAAQ,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QACnC,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,SAAS,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;KACX,CAAA;CACF;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,cAAc,EAAE,CAAA;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-jql.d.ts","sourceRoot":"","sources":["../../src/tools/execute-jql.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,SA4CpD,CAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { executeJql } from '../lib/jira.service.js';
|
|
4
|
+
export const registerExecuteJqlTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'execute-jql',
|
|
6
|
+
title: 'Execute Jira JQL',
|
|
7
|
+
description: 'Execute a Jira Query Language (JQL) search and return issues.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
jql: z.string().describe('JQL query string'),
|
|
10
|
+
maxResults: z
|
|
11
|
+
.number()
|
|
12
|
+
.int()
|
|
13
|
+
.min(1)
|
|
14
|
+
.max(100)
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Maximum number of results to return (default: 50)'),
|
|
17
|
+
startAt: z.number().int().min(0).optional().describe('Index of first result for pagination (default: 0)'),
|
|
18
|
+
fields: z
|
|
19
|
+
.array(z.string())
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Fields to include in results (default: [summary, status, assignee])'),
|
|
22
|
+
},
|
|
23
|
+
outputSchema: {
|
|
24
|
+
total: z.number(),
|
|
25
|
+
issues: z.array(z.object({
|
|
26
|
+
key: z.string(),
|
|
27
|
+
summary: z.string().optional(),
|
|
28
|
+
status: z.string().optional(),
|
|
29
|
+
})),
|
|
30
|
+
},
|
|
31
|
+
isReadOnly: true,
|
|
32
|
+
async fetcher(params) {
|
|
33
|
+
return executeJql(params.jql, params.maxResults, params.startAt, params.fields);
|
|
34
|
+
},
|
|
35
|
+
formatter(data) {
|
|
36
|
+
return {
|
|
37
|
+
total: data.total,
|
|
38
|
+
issues: data.issues.map((issue) => ({
|
|
39
|
+
key: issue.key,
|
|
40
|
+
summary: issue.fields.summary,
|
|
41
|
+
status: issue.fields.status?.name,
|
|
42
|
+
})),
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=execute-jql.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-jql.js","sourceRoot":"","sources":["../../src/tools/execute-jql.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAInD,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAAiB,EAAE,EAAE,CAC1D,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,kBAAkB;IACzB,WAAW,EAAE,+DAA+D;IAC5E,WAAW,EAAE;QACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC5C,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,mDAAmD,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QACzG,MAAM,EAAE,CAAC;aACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,qEAAqE,CAAC;KACnF;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,MAAM,EAAE,CAAC,CAAC,KAAK,CACb,CAAC,CAAC,MAAM,CAAC;YACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC9B,CAAC,CACH;KACF;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO,CAAC,MAAM;QAClB,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACjF,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAClC,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;gBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;aAClC,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-current-profile.d.ts","sourceRoot":"","sources":["../../src/tools/get-current-profile.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,6BAA6B,GAAI,QAAQ,SAAS,SAsB3D,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getCurrentProfile } from '../lib/jira.service.js';
|
|
4
|
+
export const registerGetCurrentProfileTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'get-current-profile',
|
|
6
|
+
title: 'Get Current Jira Profile',
|
|
7
|
+
description: 'Get information about the current authenticated Jira user.',
|
|
8
|
+
inputSchema: {},
|
|
9
|
+
outputSchema: {
|
|
10
|
+
displayName: z.string(),
|
|
11
|
+
emailAddress: z.string(),
|
|
12
|
+
accountId: z.string(),
|
|
13
|
+
},
|
|
14
|
+
isReadOnly: true,
|
|
15
|
+
async fetcher() {
|
|
16
|
+
return getCurrentProfile();
|
|
17
|
+
},
|
|
18
|
+
formatter(data) {
|
|
19
|
+
return {
|
|
20
|
+
displayName: data.displayName,
|
|
21
|
+
emailAddress: data.emailAddress,
|
|
22
|
+
accountId: data.accountId,
|
|
23
|
+
};
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=get-current-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-current-profile.js","sourceRoot":"","sources":["../../src/tools/get-current-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAI1D,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,MAAiB,EAAE,EAAE,CACjE,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,4DAA4D;IACzE,WAAW,EAAE,EAAE;IACf,YAAY,EAAE;QACZ,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;KACtB;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO;QACX,OAAO,iBAAiB,EAAE,CAAA;IAC5B,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-issue.d.ts","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,SAAS,SA8BlD,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getIssue } from '../lib/jira.service.js';
|
|
4
|
+
export const registerGetIssueTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'get-issue',
|
|
6
|
+
title: 'Get Jira Issue',
|
|
7
|
+
description: 'Fetch a Jira issue and its details by key or ID.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
issueIdOrKey: z.string().describe('Jira issue key or numeric ID'),
|
|
10
|
+
fields: z.array(z.string()).optional().describe('Fields to include in response (default: all available)'),
|
|
11
|
+
expand: z.array(z.string()).optional().describe('Fields to expand (e.g., comments, changelog)'),
|
|
12
|
+
},
|
|
13
|
+
outputSchema: {
|
|
14
|
+
key: z.string(),
|
|
15
|
+
summary: z.string().optional(),
|
|
16
|
+
status: z.string().optional(),
|
|
17
|
+
assignee: z.string().optional(),
|
|
18
|
+
description: z.string().optional(),
|
|
19
|
+
},
|
|
20
|
+
isReadOnly: true,
|
|
21
|
+
async fetcher({ issueIdOrKey, fields, expand }) {
|
|
22
|
+
return getIssue(issueIdOrKey, fields, expand);
|
|
23
|
+
},
|
|
24
|
+
formatter(data) {
|
|
25
|
+
return {
|
|
26
|
+
key: data.key,
|
|
27
|
+
summary: data.fields.summary,
|
|
28
|
+
status: data.fields.status?.name,
|
|
29
|
+
assignee: data.fields.assignee?.displayName,
|
|
30
|
+
description: data.fields.description,
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=get-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-issue.js","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAIjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiB,EAAE,EAAE,CACxD,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,gBAAgB;IACvB,WAAW,EAAE,kDAAkD;IAC/D,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QACzG,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8CAA8C,CAAC;KAChG;IACD,YAAY,EAAE;QACZ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE;QAC5C,OAAO,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/C,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW;YAC3C,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;SACrC,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-latest-projects.d.ts","sourceRoot":"","sources":["../../src/tools/get-latest-projects.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,6BAA6B,GAAI,QAAQ,SAAS,SAiC3D,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getLatestProjects } from '../lib/jira.service.js';
|
|
4
|
+
export const registerGetLatestProjectsTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'get-latest-projects',
|
|
6
|
+
title: 'Get Latest Jira Projects',
|
|
7
|
+
description: 'Retrieve the most recently created Jira projects visible to the current user.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
maxResults: z
|
|
10
|
+
.number()
|
|
11
|
+
.int()
|
|
12
|
+
.min(1)
|
|
13
|
+
.max(50)
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('Maximum number of projects to return (default: 10)'),
|
|
16
|
+
},
|
|
17
|
+
outputSchema: {
|
|
18
|
+
total: z.number(),
|
|
19
|
+
projects: z.array(z.object({
|
|
20
|
+
key: z.string(),
|
|
21
|
+
name: z.string(),
|
|
22
|
+
})),
|
|
23
|
+
},
|
|
24
|
+
isReadOnly: true,
|
|
25
|
+
async fetcher({ maxResults }) {
|
|
26
|
+
return getLatestProjects(maxResults);
|
|
27
|
+
},
|
|
28
|
+
formatter(data) {
|
|
29
|
+
return {
|
|
30
|
+
total: data.total,
|
|
31
|
+
projects: data.values.map((p) => ({ key: p.key, name: p.name })),
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
//# sourceMappingURL=get-latest-projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-latest-projects.js","sourceRoot":"","sources":["../../src/tools/get-latest-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAI1D,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,MAAiB,EAAE,EAAE,CACjE,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,qBAAqB;IAC3B,KAAK,EAAE,0BAA0B;IACjC,WAAW,EAAE,+EAA+E;IAC5F,WAAW,EAAE;QACX,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,EAAE,CAAC;aACP,QAAQ,EAAE;aACV,QAAQ,CAAC,oDAAoD,CAAC;KAClE;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;YACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACjB,CAAC,CACH;KACF;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE;QAC1B,OAAO,iBAAiB,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SACjE,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ticket-transitions.d.ts","sourceRoot":"","sources":["../../src/tools/get-ticket-transitions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,gCAAgC,GAAI,QAAQ,SAAS,SA8B9D,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getTicketTransitions } from '../lib/jira.service.js';
|
|
4
|
+
export const registerGetTicketTransitionsTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'get-ticket-transitions',
|
|
6
|
+
title: 'Get Jira Ticket Transitions',
|
|
7
|
+
description: 'List all possible status transitions for a given Jira issue (name and ID).',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
issueIdOrKey: z.string().describe('Jira issue key or numeric ID'),
|
|
10
|
+
},
|
|
11
|
+
outputSchema: {
|
|
12
|
+
transitions: z.array(z.object({
|
|
13
|
+
id: z.string(),
|
|
14
|
+
name: z.string(),
|
|
15
|
+
toStatus: z.string(),
|
|
16
|
+
})),
|
|
17
|
+
},
|
|
18
|
+
isReadOnly: true,
|
|
19
|
+
async fetcher({ issueIdOrKey }) {
|
|
20
|
+
return getTicketTransitions(issueIdOrKey);
|
|
21
|
+
},
|
|
22
|
+
formatter(data) {
|
|
23
|
+
return {
|
|
24
|
+
transitions: data.transitions.map((t) => ({
|
|
25
|
+
id: t.id,
|
|
26
|
+
name: t.name,
|
|
27
|
+
toStatus: t.to.name,
|
|
28
|
+
})),
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=get-ticket-transitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ticket-transitions.js","sourceRoot":"","sources":["../../src/tools/get-ticket-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAI7D,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,MAAiB,EAAE,EAAE,CACpE,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,wBAAwB;IAC9B,KAAK,EAAE,6BAA6B;IACpC,WAAW,EAAE,4EAA4E;IACzF,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KAClE;IACD,YAAY,EAAE;QACZ,WAAW,EAAE,CAAC,CAAC,KAAK,CAClB,CAAC,CAAC,MAAM,CAAC;YACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;YACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;SACrB,CAAC,CACH;KACF;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE;QAC5B,OAAO,oBAAoB,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI;aACpB,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-issue-status.d.ts","sourceRoot":"","sources":["../../src/tools/set-issue-status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,0BAA0B,GAAI,QAAQ,SAAS,SAkCxD,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { findTransitionIdByName, setIssueStatus } from '../lib/jira.service.js';
|
|
4
|
+
export const registerSetIssueStatusTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'set-issue-status',
|
|
6
|
+
title: 'Set Jira Issue Status',
|
|
7
|
+
description: 'Transition a Jira issue to a new status by status name or transition ID.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
issueIdOrKey: z.string().describe('Jira issue key or numeric ID'),
|
|
10
|
+
status: z.string().optional().describe('Target status name (e.g., Done, In Progress, To Do)'),
|
|
11
|
+
transitionId: z.string().optional().describe('Transition ID (if known; takes precedence over status name)'),
|
|
12
|
+
comment: z.string().optional().describe('Comment to add with the transition'),
|
|
13
|
+
},
|
|
14
|
+
outputSchema: {
|
|
15
|
+
message: z.string(),
|
|
16
|
+
},
|
|
17
|
+
isDestructive: true,
|
|
18
|
+
async fetcher({ issueIdOrKey, status, transitionId, comment }) {
|
|
19
|
+
let finalTransitionId = transitionId;
|
|
20
|
+
if (!finalTransitionId && status) {
|
|
21
|
+
finalTransitionId = await findTransitionIdByName(issueIdOrKey, status);
|
|
22
|
+
if (!finalTransitionId) {
|
|
23
|
+
throw new Error(`No transition found for status: ${status}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (!finalTransitionId) {
|
|
27
|
+
throw new Error('Either transitionId or a valid status name must be provided.');
|
|
28
|
+
}
|
|
29
|
+
await setIssueStatus(issueIdOrKey, finalTransitionId, comment);
|
|
30
|
+
return `Issue ${issueIdOrKey} transitioned successfully${status ? ` to status: ${status}` : ''}.`;
|
|
31
|
+
},
|
|
32
|
+
formatter(message) {
|
|
33
|
+
return { message };
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=set-issue-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-issue-status.js","sourceRoot":"","sources":["../../src/tools/set-issue-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAI/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,MAAiB,EAAE,EAAE,CAC9D,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,kBAAkB;IACxB,KAAK,EAAE,uBAAuB;IAC9B,WAAW,EAAE,0EAA0E;IACvF,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;QAC7F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6DAA6D,CAAC;QAC3G,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;KAC9E;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;KACpB;IACD,aAAa,EAAE,IAAI;IACnB,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE;QAC3D,IAAI,iBAAiB,GAAG,YAAY,CAAA;QACpC,IAAI,CAAC,iBAAiB,IAAI,MAAM,EAAE,CAAC;YACjC,iBAAiB,GAAG,MAAM,sBAAsB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;YACtE,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,EAAE,CAAC,CAAA;YAC9D,CAAC;QACH,CAAC;QAED,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;QACjF,CAAC;QAED,MAAM,cAAc,CAAC,YAAY,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAA;QAC9D,OAAO,SAAS,YAAY,6BAA6B,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;IACnG,CAAC;IACD,SAAS,CAAC,OAAO;QACf,OAAO,EAAE,OAAO,EAAE,CAAA;IACpB,CAAC;CACF,CAAC,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mcp-monorepo/jira",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "MCP server for Jira tools (JQL, issue management, etc.).",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"mcp-npm-server": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc -b",
|
|
19
|
+
"dev": "tsc --watch",
|
|
20
|
+
"start": "node dist/index.js",
|
|
21
|
+
"test": "vitest run --passWithNoTests",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"test:coverage": "vitest run --coverage",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"clean": "rimraf dist tsconfig.tsbuildinfo"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@mcp-monorepo/shared": "*",
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
30
|
+
"zod": "^3.25.76"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^22.14.1",
|
|
34
|
+
"typescript": "^5.8.3",
|
|
35
|
+
"vitest": "^3.2.4",
|
|
36
|
+
"rimraf": "^6.0.1"
|
|
37
|
+
}
|
|
38
|
+
}
|