@mcp-monorepo/jira 1.3.0 → 1.4.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/README.md +80 -8
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/adf-utils.d.ts +19 -0
- package/dist/lib/adf-utils.d.ts.map +1 -0
- package/dist/lib/adf-utils.js +52 -0
- package/dist/lib/adf-utils.js.map +1 -0
- package/dist/lib/jira-env.d.ts +2 -0
- package/dist/lib/jira-env.d.ts.map +1 -1
- package/dist/lib/jira-env.js +7 -0
- package/dist/lib/jira-env.js.map +1 -1
- package/dist/lib/jira.service.d.ts +29 -2
- package/dist/lib/jira.service.d.ts.map +1 -1
- package/dist/lib/jira.service.js +160 -12
- package/dist/lib/jira.service.js.map +1 -1
- package/dist/lib/types.d.ts +91 -3
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/tools/add-comment.d.ts +3 -0
- package/dist/tools/add-comment.d.ts.map +1 -0
- package/dist/tools/add-comment.js +38 -0
- package/dist/tools/add-comment.js.map +1 -0
- package/dist/tools/create-issue.d.ts +3 -0
- package/dist/tools/create-issue.d.ts.map +1 -0
- package/dist/tools/create-issue.js +48 -0
- package/dist/tools/create-issue.js.map +1 -0
- package/dist/tools/execute-jql.d.ts.map +1 -1
- package/dist/tools/execute-jql.js +39 -12
- package/dist/tools/execute-jql.js.map +1 -1
- package/dist/tools/get-create-metadata.d.ts +3 -0
- package/dist/tools/get-create-metadata.d.ts.map +1 -0
- package/dist/tools/get-create-metadata.js +59 -0
- package/dist/tools/get-create-metadata.js.map +1 -0
- package/dist/tools/get-current-profile.js +1 -1
- package/dist/tools/get-current-profile.js.map +1 -1
- package/dist/tools/get-issue.d.ts.map +1 -1
- package/dist/tools/get-issue.js +3 -2
- package/dist/tools/get-issue.js.map +1 -1
- package/dist/tools/update-issue.d.ts +3 -0
- package/dist/tools/update-issue.d.ts.map +1 -0
- package/dist/tools/update-issue.js +43 -0
- package/dist/tools/update-issue.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
<!--
|
|
2
2
|
DO NOT EDIT THIS FILE DIRECTLY.
|
|
3
3
|
IT IS AUTOMATICALLY GENERATED.
|
|
4
|
-
Last generated: 2026-02-
|
|
4
|
+
Last generated: 2026-02-18T12:57:56.494Z
|
|
5
5
|
-->
|
|
6
6
|
|
|
7
7
|
# @mcp-monorepo/jira
|
|
8
8
|
|
|
9
|
-
 
|
|
10
10
|
|
|
11
11
|
MCP server for Jira tools (JQL, issue management, etc.).
|
|
12
12
|
|
|
@@ -50,6 +50,7 @@ To integrate this server with a compatible AI model (like Claude), provide the f
|
|
|
50
50
|
"JIRA_BASE_URL": "<Your JIRA_BASE_URL Here>",
|
|
51
51
|
"JIRA_TOKEN": "<Your JIRA_TOKEN Here>",
|
|
52
52
|
"JIRA_COOKIE": "<Your JIRA_COOKIE Here>",
|
|
53
|
+
"JIRA_API_VERSION": "2",
|
|
53
54
|
"JIRA_INSECURE_SKIP_VERIFY": "false"
|
|
54
55
|
}
|
|
55
56
|
}
|
|
@@ -64,6 +65,7 @@ To integrate this server with a compatible AI model (like Claude), provide the f
|
|
|
64
65
|
| `JIRA_BASE_URL` | The base URL for your Jira instance (e.g., https://your-company.atlassian.net). | `<required>` |
|
|
65
66
|
| `JIRA_TOKEN` | A Jira Personal Access Token (PAT) with appropriate permissions to read and modify issues. Exactly one of JIRA_TOKEN or JIRA_COOKIE must be set. | `<optional>` |
|
|
66
67
|
| `JIRA_COOKIE` | A Jira session cookie value (e.g., the full Cookie header string). Useful for environments where a PAT is not available. Exactly one of JIRA_TOKEN or JIRA_COOKIE must be set. | `<optional>` |
|
|
68
|
+
| `JIRA_API_VERSION` | The Jira REST API version to use: '2' (default) or '3'. API v3 includes: (1) Issue descriptions in Atlassian Document Format (ADF) which are automatically converted to Markdown, (2) User emailAddress may be null due to GDPR privacy settings, (3) Enhanced JQL search endpoint with nextPageToken-based pagination for better performance with large result sets. Use v3 to access newer features and ADF support for rich text formatting in issue descriptions. | `2` |
|
|
67
69
|
| `JIRA_INSECURE_SKIP_VERIFY` | Set to 'true' to disable TLS certificate validation. Use with caution, as this is a security risk. Recommended only for self-hosted Jira instances with self-signed certificates. | `false` |
|
|
68
70
|
|
|
69
71
|
## Tools
|
|
@@ -81,7 +83,7 @@ To integrate this server with a compatible AI model (like Claude), provide the f
|
|
|
81
83
|
|
|
82
84
|
### `execute-jql`
|
|
83
85
|
|
|
84
|
-
**Execute Jira JQL** - Execute a Jira Query Language (JQL) search and return issues.
|
|
86
|
+
**Execute Jira JQL** - Execute a Jira Query Language (JQL) search and return issues. In API v3, uses enhanced search with nextPageToken pagination. In API v2, uses legacy search with startAt pagination.
|
|
85
87
|
|
|
86
88
|
**Input Schema**
|
|
87
89
|
|
|
@@ -89,7 +91,8 @@ To integrate this server with a compatible AI model (like Claude), provide the f
|
|
|
89
91
|
| :--- | :--- | :--- |
|
|
90
92
|
| `jql` | `string` | JQL query string |
|
|
91
93
|
| `maxResults` | `integer` | Maximum number of results to return (default: 50) |
|
|
92
|
-
| `startAt` | `integer` | Index of first result for pagination (default: 0) |
|
|
94
|
+
| `startAt` | `integer` | Index of first result for pagination (v2 only, default: 0) |
|
|
95
|
+
| `nextPageToken` | `string` | Token for next page of results (v3 only) |
|
|
93
96
|
| `fields` | `array of string` | Fields to include in results (default: [summary, status, assignee]) |
|
|
94
97
|
|
|
95
98
|
|
|
@@ -150,6 +153,75 @@ To integrate this server with a compatible AI model (like Claude), provide the f
|
|
|
150
153
|
| `issueIdOrKey` | `string` | Jira issue key or numeric ID |
|
|
151
154
|
|
|
152
155
|
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
### `get-create-metadata`
|
|
159
|
+
|
|
160
|
+
**Get Jira Create Issue Metadata** - Get metadata about fields required to create issues in a project. Returns issue types, priorities, and field requirements. Use this to find valid issueTypeId and priorityId values for creating issues.
|
|
161
|
+
|
|
162
|
+
**Input Schema**
|
|
163
|
+
|
|
164
|
+
| Property | Type | Description |
|
|
165
|
+
| :--- | :--- | :--- |
|
|
166
|
+
| `projectKey` | `string` | Filter by project key (e.g., "PROJ") |
|
|
167
|
+
| `issueTypeId` | `string` | Filter by specific issue type ID |
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
### `create-issue`
|
|
173
|
+
|
|
174
|
+
**Create Jira Issue** - Create a new Jira issue. Use get-create-metadata to find valid issueTypeId and priorityId values for your project.
|
|
175
|
+
|
|
176
|
+
**Input Schema**
|
|
177
|
+
|
|
178
|
+
| Property | Type | Description |
|
|
179
|
+
| :--- | :--- | :--- |
|
|
180
|
+
| `projectKey` | `string` | Project key (e.g., "PROJ") |
|
|
181
|
+
| `issueTypeId` | `string` | Issue type ID (use get-create-metadata to find valid IDs) |
|
|
182
|
+
| `summary` | `string` | Issue title/summary |
|
|
183
|
+
| `description` | `string` | Issue description (supports Markdown formatting in API v3, plain text in v2) |
|
|
184
|
+
| `assigneeId` | `string` | Assignee account ID (leave empty for unassigned) |
|
|
185
|
+
| `priorityId` | `string` | Priority ID (use get-create-metadata to find valid IDs) |
|
|
186
|
+
| `labels` | `array of string` | Labels for the issue |
|
|
187
|
+
| `parentKey` | `string` | Parent issue key (required for creating subtasks) |
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
### `update-issue`
|
|
193
|
+
|
|
194
|
+
**Update Jira Issue** - Update fields of an existing Jira issue. Only provided fields will be updated, others remain unchanged.
|
|
195
|
+
|
|
196
|
+
**Input Schema**
|
|
197
|
+
|
|
198
|
+
| Property | Type | Description |
|
|
199
|
+
| :--- | :--- | :--- |
|
|
200
|
+
| `issueIdOrKey` | `string` | Issue key or ID (e.g., "PROJ-123") |
|
|
201
|
+
| `summary` | `string` | New issue title/summary |
|
|
202
|
+
| `description` | `string` | New description (supports Markdown formatting in API v3, plain text in v2) |
|
|
203
|
+
| `assigneeId` | `any` | Assignee account ID (null to unassign, undefined to leave unchanged) |
|
|
204
|
+
| `priorityId` | `string` | New priority ID |
|
|
205
|
+
| `labels` | `array of string` | New labels (replaces existing labels) |
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
### `add-comment`
|
|
211
|
+
|
|
212
|
+
**Add Comment to Jira Issue** - Add a comment to an existing Jira issue.
|
|
213
|
+
|
|
214
|
+
**Input Schema**
|
|
215
|
+
|
|
216
|
+
| Property | Type | Description |
|
|
217
|
+
| :--- | :--- | :--- |
|
|
218
|
+
| `issueIdOrKey` | `string` | Issue key or ID (e.g., "PROJ-123") |
|
|
219
|
+
| `comment` | `string` | Comment text (supports Markdown formatting in API v3, plain text in v2) |
|
|
220
|
+
| `visibility` | `object` | Restrict comment visibility to a specific role or group (optional) |
|
|
221
|
+
| `visibility.type` | `string` | Visibility type: role or group |
|
|
222
|
+
| `visibility.value` | `string` | Role name or group name |
|
|
223
|
+
|
|
224
|
+
|
|
153
225
|
## Other MCP Servers
|
|
154
226
|
|
|
155
227
|
This monorepo contains several other MCP server packages available on npm. Each provides a distinct set of tools for use with the Model Context Protocol.
|
|
@@ -167,6 +239,10 @@ This monorepo contains several other MCP server packages available on npm. Each
|
|
|
167
239
|
|
|
168
240
|
## Recent Changes
|
|
169
241
|
|
|
242
|
+
### Version 1.3.0
|
|
243
|
+
|
|
244
|
+
- 397cff4: add cookie-based authentication and require exactly one of JIRA_TOKEN or JIRA_COOKIE
|
|
245
|
+
|
|
170
246
|
### Version 1.2.0
|
|
171
247
|
|
|
172
248
|
- 7f6ee0a: generate READMEs for packages via MCP introspection, add docgen and scripts, bump zod to v4 with schema fixes, improve syslog/logger graceful shutdown
|
|
@@ -175,10 +251,6 @@ This monorepo contains several other MCP server packages available on npm. Each
|
|
|
175
251
|
|
|
176
252
|
- fd22b00: Fixed yarn versioning during publish
|
|
177
253
|
|
|
178
|
-
### Version 1.1.2
|
|
179
|
-
|
|
180
|
-
- Updated dependencies [7929a55]
|
|
181
|
-
|
|
182
254
|
---
|
|
183
255
|
## Authors
|
|
184
256
|
|
package/dist/index.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { createMcpServer, logger } from '@mcp-monorepo/shared';
|
|
3
|
-
import { getJiraAuthMode, getJiraBaseUrl } from './lib/jira-env.js';
|
|
3
|
+
import { getJiraApiVersion, getJiraAuthMode, getJiraBaseUrl } from './lib/jira-env.js';
|
|
4
4
|
import { getCurrentProfile } from './lib/jira.service.js';
|
|
5
|
+
import { registerAddCommentTool } from './tools/add-comment.js';
|
|
6
|
+
import { registerCreateIssueTool } from './tools/create-issue.js';
|
|
5
7
|
import { registerExecuteJqlTool } from './tools/execute-jql.js';
|
|
8
|
+
import { registerGetCreateMetadataTool } from './tools/get-create-metadata.js';
|
|
6
9
|
import { registerGetCurrentProfileTool } from './tools/get-current-profile.js';
|
|
7
10
|
import { registerGetIssueTool } from './tools/get-issue.js';
|
|
8
11
|
import { registerGetLatestProjectsTool } from './tools/get-latest-projects.js';
|
|
9
12
|
import { registerGetTicketTransitionsTool } from './tools/get-ticket-transitions.js';
|
|
10
13
|
import { registerSetIssueStatusTool } from './tools/set-issue-status.js';
|
|
14
|
+
import { registerUpdateIssueTool } from './tools/update-issue.js';
|
|
11
15
|
createMcpServer({
|
|
12
16
|
name: 'jira',
|
|
13
17
|
importMetaPath: import.meta.filename,
|
|
@@ -19,6 +23,10 @@ createMcpServer({
|
|
|
19
23
|
registerGetIssueTool,
|
|
20
24
|
registerSetIssueStatusTool,
|
|
21
25
|
registerGetTicketTransitionsTool,
|
|
26
|
+
registerGetCreateMetadataTool,
|
|
27
|
+
registerCreateIssueTool,
|
|
28
|
+
registerUpdateIssueTool,
|
|
29
|
+
registerAddCommentTool,
|
|
22
30
|
],
|
|
23
31
|
async onReady() {
|
|
24
32
|
if (process.env.JIRA_INSECURE_SKIP_VERIFY === 'true') {
|
|
@@ -28,12 +36,20 @@ createMcpServer({
|
|
|
28
36
|
// Eagerly validate environment variables to fail fast on startup.
|
|
29
37
|
getJiraBaseUrl();
|
|
30
38
|
const auth = getJiraAuthMode();
|
|
39
|
+
const apiVersion = getJiraApiVersion();
|
|
40
|
+
logger.info(`Using Jira REST API version ${apiVersion}`);
|
|
31
41
|
logger.info(`Using Jira authentication mode: ${auth.type}`);
|
|
42
|
+
if (apiVersion === '3') {
|
|
43
|
+
logger.info('API v3 features: Issue descriptions are converted from Atlassian Document Format (ADF) to Markdown. ' +
|
|
44
|
+
'User emailAddress may be null due to GDPR privacy settings. ' +
|
|
45
|
+
'JQL search uses enhanced endpoint with nextPageToken pagination.');
|
|
46
|
+
}
|
|
32
47
|
// Perform a test API call to ensure credentials are valid and the service is reachable.
|
|
33
48
|
try {
|
|
34
49
|
logger.info('Verifying Jira connection and credentials...');
|
|
35
50
|
const profile = await getCurrentProfile();
|
|
36
|
-
|
|
51
|
+
const emailDisplay = profile.emailAddress || '<email hidden>';
|
|
52
|
+
logger.info(`Successfully connected to Jira as "${profile.displayName}" (${emailDisplay}).`);
|
|
37
53
|
}
|
|
38
54
|
catch (error) {
|
|
39
55
|
logger.error('Failed to connect to Jira. Please check JIRA_BASE_URL, JIRA_TOKEN/JIRA_COOKIE, and TLS settings.', error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;
|
|
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,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAA;AAC9E,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;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAEjE,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;QAChC,6BAA6B;QAC7B,uBAAuB;QACvB,uBAAuB;QACvB,sBAAsB;KACvB;IACD,KAAK,CAAC,OAAO;QACX,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,MAAM,EAAE,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAA;YAC9C,MAAM,CAAC,IAAI,CACT,mLAAmL,CACpL,CAAA;QACH,CAAC;QAED,kEAAkE;QAClE,cAAc,EAAE,CAAA;QAChB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;QAC9B,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;QAEtC,MAAM,CAAC,IAAI,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAA;QACxD,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAE3D,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,sGAAsG;gBACpG,8DAA8D;gBAC9D,kEAAkE,CACrE,CAAA;QACH,CAAC;QAED,wFAAwF;QACxF,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;YAC3D,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACzC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,gBAAgB,CAAA;YAC7D,MAAM,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,WAAW,MAAM,YAAY,IAAI,CAAC,CAAA;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CACV,kGAAkG,EAClG,KAAK,CACN,CAAA;YACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzD,CAAC;IACH,CAAC;CACF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for converting between Atlassian Document Format (ADF) and Markdown
|
|
3
|
+
*/
|
|
4
|
+
import { type ADFDocument } from 'extended-markdown-adf-parser';
|
|
5
|
+
/**
|
|
6
|
+
* Convert ADF to Markdown string
|
|
7
|
+
* Returns undefined if input is undefined, empty string if conversion fails
|
|
8
|
+
*/
|
|
9
|
+
export declare function adfToMd(adf: ADFDocument | string | undefined): string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Convert Markdown string to ADF
|
|
12
|
+
* Returns undefined if input is undefined
|
|
13
|
+
*/
|
|
14
|
+
export declare function mdToAdf(markdown: string | undefined): ADFDocument | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Check if a value is an ADF object
|
|
17
|
+
*/
|
|
18
|
+
export declare function isAdf(value: unknown): value is ADFDocument;
|
|
19
|
+
//# sourceMappingURL=adf-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adf-utils.d.ts","sourceRoot":"","sources":["../../src/lib/adf-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,KAAK,WAAW,EAA4C,MAAM,8BAA8B,CAAA;AAKzG;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUjF;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAS7E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAU1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for converting between Atlassian Document Format (ADF) and Markdown
|
|
3
|
+
*/
|
|
4
|
+
import { logger } from '@mcp-monorepo/shared';
|
|
5
|
+
import { AdfToMarkdownEngine, MarkdownToAdfEngine } from 'extended-markdown-adf-parser';
|
|
6
|
+
const adfToMarkdownEngine = new AdfToMarkdownEngine();
|
|
7
|
+
const markdownToAdfEngine = new MarkdownToAdfEngine();
|
|
8
|
+
/**
|
|
9
|
+
* Convert ADF to Markdown string
|
|
10
|
+
* Returns undefined if input is undefined, empty string if conversion fails
|
|
11
|
+
*/
|
|
12
|
+
export function adfToMd(adf) {
|
|
13
|
+
if (!adf)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (typeof adf === 'string')
|
|
16
|
+
return adf; // Already a string (v2 format)
|
|
17
|
+
try {
|
|
18
|
+
return adfToMarkdownEngine.convert(adf);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
logger.error('Failed to convert ADF to Markdown:', error);
|
|
22
|
+
return ''; // Return empty string on error
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Convert Markdown string to ADF
|
|
27
|
+
* Returns undefined if input is undefined
|
|
28
|
+
*/
|
|
29
|
+
export function mdToAdf(markdown) {
|
|
30
|
+
if (!markdown)
|
|
31
|
+
return undefined;
|
|
32
|
+
try {
|
|
33
|
+
return markdownToAdfEngine.convert(markdown);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
logger.error('Failed to convert Markdown to ADF:', error);
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a value is an ADF object
|
|
42
|
+
*/
|
|
43
|
+
export function isAdf(value) {
|
|
44
|
+
return (typeof value === 'object' &&
|
|
45
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
46
|
+
value != null &&
|
|
47
|
+
'type' in value &&
|
|
48
|
+
value.type === 'doc' &&
|
|
49
|
+
'version' in value &&
|
|
50
|
+
'content' in value);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=adf-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adf-utils.js","sourceRoot":"","sources":["../../src/lib/adf-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAoB,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAEzG,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAA;AACrD,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAA;AAErD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,GAAqC;IAC3D,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAA,CAAC,+BAA+B;IAEvE,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAA;QACzD,OAAO,EAAE,CAAA,CAAC,+BAA+B;IAC3C,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,QAA4B;IAClD,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAE/B,IAAI,CAAC;QACH,OAAO,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAgB,CAAA;IAC7D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAA;QACzD,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,KAAc;IAClC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,gDAAgD;QAChD,KAAK,IAAI,IAAI;QACb,MAAM,IAAI,KAAK;QACf,KAAK,CAAC,IAAI,KAAK,KAAK;QACpB,SAAS,IAAI,KAAK;QAClB,SAAS,IAAI,KAAK,CACnB,CAAA;AACH,CAAC"}
|
package/dist/lib/jira-env.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export type JiraAuthMode = {
|
|
|
9
9
|
type: 'cookie';
|
|
10
10
|
value: string;
|
|
11
11
|
};
|
|
12
|
+
export type JiraApiVersion = '2' | '3';
|
|
12
13
|
export declare function getJiraBaseUrl(): string;
|
|
13
14
|
export declare function getJiraAuthMode(): JiraAuthMode;
|
|
15
|
+
export declare function getJiraApiVersion(): JiraApiVersion;
|
|
14
16
|
//# sourceMappingURL=jira-env.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-env.d.ts","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"jira-env.d.ts","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC/F,MAAM,MAAM,cAAc,GAAG,GAAG,GAAG,GAAG,CAAA;AAEtC,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAY9C;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD"}
|
package/dist/lib/jira-env.js
CHANGED
|
@@ -19,4 +19,11 @@ export function getJiraAuthMode() {
|
|
|
19
19
|
}
|
|
20
20
|
return token ? { type: 'token', value: token } : { type: 'cookie', value: cookie };
|
|
21
21
|
}
|
|
22
|
+
export function getJiraApiVersion() {
|
|
23
|
+
const version = process.env.JIRA_API_VERSION;
|
|
24
|
+
if (version && version !== '2' && version !== '3') {
|
|
25
|
+
throw new Error('JIRA_API_VERSION must be either "2" or "3"');
|
|
26
|
+
}
|
|
27
|
+
return (version || '2'); // Default: v2
|
|
28
|
+
}
|
|
22
29
|
//# sourceMappingURL=jira-env.js.map
|
package/dist/lib/jira-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-env.js","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"jira-env.js","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,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;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAA;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;IAEtC,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAA;IAClG,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAgB,EAAE,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;IAC5C,IAAI,OAAO,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IACD,OAAO,CAAC,OAAO,IAAI,GAAG,CAAmB,CAAA,CAAC,cAAc;AAC1D,CAAC"}
|
|
@@ -1,9 +1,36 @@
|
|
|
1
|
-
import type { JiraIssue, JiraJqlResponse, JiraProfileResponse, JiraProjectsListResponse, JiraTransitionsResponse } from './types.js';
|
|
1
|
+
import type { JiraComment, JiraCreateIssueResponse, JiraCreateMetadata, JiraEnhancedJqlResponse, JiraIssue, JiraJqlResponse, JiraProfileResponse, JiraProjectsListResponse, JiraTransitionsResponse } from './types.js';
|
|
2
2
|
export declare const getIssue: (issueIdOrKey: string, fields?: string[], expand?: string[]) => Promise<JiraIssue>;
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Execute JQL search using enhanced search endpoint (v3) or legacy search (v2)
|
|
5
|
+
* In v3, uses /rest/api/3/search/jql with nextPageToken pagination
|
|
6
|
+
* In v2, uses /rest/api/2/search with startAt pagination
|
|
7
|
+
*/
|
|
8
|
+
export declare const executeJql: (jql: string, maxResults?: number, startAt?: number, fields?: string[], nextPageToken?: string) => Promise<JiraEnhancedJqlResponse> | Promise<JiraJqlResponse>;
|
|
4
9
|
export declare const getLatestProjects: (maxResults?: number) => Promise<JiraProjectsListResponse>;
|
|
5
10
|
export declare const getCurrentProfile: () => Promise<JiraProfileResponse>;
|
|
6
11
|
export declare const getTicketTransitions: (issueIdOrKey: string) => Promise<JiraTransitionsResponse>;
|
|
7
12
|
export declare const setIssueStatus: (issueIdOrKey: string, transitionId: string, comment?: string) => Promise<void>;
|
|
8
13
|
export declare const findTransitionIdByName: (issueIdOrKey: string, statusName: string) => Promise<string | undefined>;
|
|
14
|
+
export declare const getCreateMetadata: (projectKey?: string, issueTypeId?: string) => Promise<JiraCreateMetadata>;
|
|
15
|
+
export declare const createIssue: (params: {
|
|
16
|
+
projectKey: string;
|
|
17
|
+
issueTypeId: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
assigneeId?: string;
|
|
21
|
+
priorityId?: string;
|
|
22
|
+
labels?: string[];
|
|
23
|
+
parentKey?: string;
|
|
24
|
+
}) => Promise<JiraCreateIssueResponse>;
|
|
25
|
+
export declare const updateIssue: (issueIdOrKey: string, updates: {
|
|
26
|
+
summary?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
assigneeId?: string | null;
|
|
29
|
+
priorityId?: string;
|
|
30
|
+
labels?: string[];
|
|
31
|
+
}) => Promise<void>;
|
|
32
|
+
export declare const addComment: (issueIdOrKey: string, commentText: string, visibility?: {
|
|
33
|
+
type: "role" | "group";
|
|
34
|
+
value: string;
|
|
35
|
+
}) => Promise<JiraComment>;
|
|
9
36
|
//# sourceMappingURL=jira.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira.service.d.ts","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jira.service.d.ts","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AAkEnB,eAAO,MAAM,QAAQ,GAAI,cAAc,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,SAAS,MAAM,EAAE,uBAKlF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,mBAAe,EAAE,gBAAW,EAAE,SAAS,MAAM,EAAE,EAAE,gBAAgB,MAAM,gEAqB9G,CAAA;AAED,eAAO,MAAM,iBAAiB,GAAI,mBAAe,sCAIhD,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;AAED,eAAO,MAAM,iBAAiB,GAAU,aAAa,MAAM,EAAE,cAAc,MAAM,gCAOhF,CAAA;AAED,eAAO,MAAM,WAAW,GAAU,QAAQ;IACxC,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,KAAG,OAAO,CAAC,uBAAuB,CA6ClC,CAAA;AAED,eAAO,MAAM,WAAW,GACtB,cAAc,MAAM,EACpB,SAAS;IACP,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB,KACA,OAAO,CAAC,IAAI,CAqCd,CAAA;AAED,eAAO,MAAM,UAAU,GACrB,cAAc,MAAM,EACpB,aAAa,MAAM,EACnB,aAAa;IAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KACrD,OAAO,CAAC,WAAW,CAerB,CAAA"}
|
package/dist/lib/jira.service.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mdToAdf } from './adf-utils.js';
|
|
2
|
+
import { getJiraApiVersion, getJiraAuthMode, getJiraBaseUrl } from './jira-env.js';
|
|
2
3
|
function buildAuthHeaders() {
|
|
3
4
|
const auth = getJiraAuthMode();
|
|
4
5
|
if (auth.type === 'token') {
|
|
@@ -6,6 +7,10 @@ function buildAuthHeaders() {
|
|
|
6
7
|
}
|
|
7
8
|
return { Cookie: auth.value };
|
|
8
9
|
}
|
|
10
|
+
function buildApiPath(endpoint) {
|
|
11
|
+
const version = getJiraApiVersion();
|
|
12
|
+
return `/rest/api/${version}${endpoint}`;
|
|
13
|
+
}
|
|
9
14
|
async function jiraRequest(endpoint, options = {}) {
|
|
10
15
|
const url = new URL(endpoint, getJiraBaseUrl());
|
|
11
16
|
const response = await fetch(url.toString(), {
|
|
@@ -19,7 +24,28 @@ async function jiraRequest(endpoint, options = {}) {
|
|
|
19
24
|
});
|
|
20
25
|
if (!response.ok) {
|
|
21
26
|
const errorText = await response.text();
|
|
22
|
-
|
|
27
|
+
let enhancedError = `Jira API request failed with status ${response.status}: ${errorText}`;
|
|
28
|
+
// Parse error and add helpful context
|
|
29
|
+
try {
|
|
30
|
+
const errorJson = JSON.parse(errorText);
|
|
31
|
+
if (errorJson.errors && Object.keys(errorJson.errors).length > 0) {
|
|
32
|
+
enhancedError += '\n\nMissing or invalid fields:';
|
|
33
|
+
Object.entries(errorJson.errors).forEach(([field, message]) => {
|
|
34
|
+
enhancedError += `\n - ${field}: ${message}`;
|
|
35
|
+
});
|
|
36
|
+
enhancedError += '\n\nTip: Use "get-create-metadata" tool to see available fields and requirements.';
|
|
37
|
+
}
|
|
38
|
+
if (errorJson.errorMessages && errorJson.errorMessages.length > 0) {
|
|
39
|
+
enhancedError += '\n\nError messages:';
|
|
40
|
+
errorJson.errorMessages.forEach((msg) => {
|
|
41
|
+
enhancedError += `\n - ${msg}`;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// If JSON parsing fails, use original error text
|
|
47
|
+
}
|
|
48
|
+
throw new Error(enhancedError);
|
|
23
49
|
}
|
|
24
50
|
if (response.status === 204) {
|
|
25
51
|
return undefined;
|
|
@@ -32,29 +58,50 @@ export const getIssue = (issueIdOrKey, fields, expand) => {
|
|
|
32
58
|
params.set('fields', fields.join(','));
|
|
33
59
|
if (expand)
|
|
34
60
|
params.set('expand', expand.join(','));
|
|
35
|
-
return jiraRequest(`/
|
|
61
|
+
return jiraRequest(`${buildApiPath(`/issue/${issueIdOrKey}`)}?${params.toString()}`);
|
|
36
62
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
63
|
+
/**
|
|
64
|
+
* Execute JQL search using enhanced search endpoint (v3) or legacy search (v2)
|
|
65
|
+
* In v3, uses /rest/api/3/search/jql with nextPageToken pagination
|
|
66
|
+
* In v2, uses /rest/api/2/search with startAt pagination
|
|
67
|
+
*/
|
|
68
|
+
export const executeJql = (jql, maxResults = 50, startAt = 0, fields, nextPageToken) => {
|
|
69
|
+
const apiVersion = getJiraApiVersion();
|
|
70
|
+
if (apiVersion === '3') {
|
|
71
|
+
// Use enhanced search endpoint in v3
|
|
72
|
+
return jiraRequest(buildApiPath('/search/jql'), {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
jql,
|
|
76
|
+
maxResults,
|
|
77
|
+
fields: fields ?? ['summary', 'status', 'assignee'],
|
|
78
|
+
...(nextPageToken && { nextPageToken }),
|
|
79
|
+
}),
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Use legacy search endpoint in v2
|
|
84
|
+
return jiraRequest(buildApiPath('/search'), {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
body: JSON.stringify({ jql, maxResults, startAt, fields: fields ?? ['summary', 'status', 'assignee'] }),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
42
89
|
};
|
|
43
90
|
export const getLatestProjects = (maxResults = 10) => {
|
|
44
|
-
return jiraRequest(
|
|
91
|
+
return jiraRequest(`${buildApiPath('/project/search')}?orderBy=created&maxResults=${maxResults}`);
|
|
45
92
|
};
|
|
46
93
|
export const getCurrentProfile = () => {
|
|
47
|
-
return jiraRequest('/
|
|
94
|
+
return jiraRequest(buildApiPath('/myself'));
|
|
48
95
|
};
|
|
49
96
|
export const getTicketTransitions = (issueIdOrKey) => {
|
|
50
|
-
return jiraRequest(`/
|
|
97
|
+
return jiraRequest(buildApiPath(`/issue/${issueIdOrKey}/transitions`));
|
|
51
98
|
};
|
|
52
99
|
export const setIssueStatus = async (issueIdOrKey, transitionId, comment) => {
|
|
53
100
|
const body = { transition: { id: transitionId } };
|
|
54
101
|
if (comment) {
|
|
55
102
|
body.update = { comment: [{ add: { body: comment } }] };
|
|
56
103
|
}
|
|
57
|
-
await jiraRequest(`/
|
|
104
|
+
await jiraRequest(buildApiPath(`/issue/${issueIdOrKey}/transitions`), {
|
|
58
105
|
method: 'POST',
|
|
59
106
|
body: JSON.stringify(body),
|
|
60
107
|
});
|
|
@@ -64,4 +111,105 @@ export const findTransitionIdByName = async (issueIdOrKey, statusName) => {
|
|
|
64
111
|
const transition = response.transitions.find((t) => t.to.name.toLowerCase() === statusName.toLowerCase());
|
|
65
112
|
return transition?.id;
|
|
66
113
|
};
|
|
114
|
+
export const getCreateMetadata = async (projectKey, issueTypeId) => {
|
|
115
|
+
const params = new URLSearchParams();
|
|
116
|
+
if (projectKey)
|
|
117
|
+
params.set('projectKeys', projectKey);
|
|
118
|
+
if (issueTypeId)
|
|
119
|
+
params.set('issuetypeIds', issueTypeId);
|
|
120
|
+
params.set('expand', 'projects.issuetypes.fields');
|
|
121
|
+
return jiraRequest(`${buildApiPath('/issue/createmeta')}?${params.toString()}`);
|
|
122
|
+
};
|
|
123
|
+
export const createIssue = async (params) => {
|
|
124
|
+
const apiVersion = getJiraApiVersion();
|
|
125
|
+
const body = {
|
|
126
|
+
fields: {
|
|
127
|
+
project: { key: params.projectKey },
|
|
128
|
+
issuetype: { id: params.issueTypeId },
|
|
129
|
+
summary: params.summary,
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
// Description: Markdown → ADF if v3, String if v2
|
|
133
|
+
if (params.description) {
|
|
134
|
+
if (apiVersion === '3') {
|
|
135
|
+
const adf = mdToAdf(params.description);
|
|
136
|
+
if (adf) {
|
|
137
|
+
;
|
|
138
|
+
body.fields.description = adf;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
;
|
|
143
|
+
body.fields.description = params.description;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Assignee: accountId works in both v2 and v3
|
|
147
|
+
if (params.assigneeId) {
|
|
148
|
+
;
|
|
149
|
+
body.fields.assignee = { id: params.assigneeId };
|
|
150
|
+
}
|
|
151
|
+
if (params.priorityId) {
|
|
152
|
+
;
|
|
153
|
+
body.fields.priority = { id: params.priorityId };
|
|
154
|
+
}
|
|
155
|
+
if (params.labels && params.labels.length > 0) {
|
|
156
|
+
;
|
|
157
|
+
body.fields.labels = params.labels;
|
|
158
|
+
}
|
|
159
|
+
// Parent for subtasks
|
|
160
|
+
if (params.parentKey) {
|
|
161
|
+
;
|
|
162
|
+
body.fields.parent = { key: params.parentKey };
|
|
163
|
+
}
|
|
164
|
+
return jiraRequest(buildApiPath('/issue'), {
|
|
165
|
+
method: 'POST',
|
|
166
|
+
body: JSON.stringify(body),
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
export const updateIssue = async (issueIdOrKey, updates) => {
|
|
170
|
+
const apiVersion = getJiraApiVersion();
|
|
171
|
+
const fields = {};
|
|
172
|
+
if (updates.summary !== undefined) {
|
|
173
|
+
fields.summary = updates.summary;
|
|
174
|
+
}
|
|
175
|
+
if (updates.description !== undefined) {
|
|
176
|
+
if (apiVersion === '3') {
|
|
177
|
+
const adf = mdToAdf(updates.description);
|
|
178
|
+
if (adf) {
|
|
179
|
+
fields.description = adf;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
fields.description = updates.description;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Assignee: null means unassign, accountId works in both v2 and v3
|
|
187
|
+
if (updates.assigneeId !== undefined) {
|
|
188
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
189
|
+
fields.assignee = updates.assigneeId ? { id: updates.assigneeId } : null;
|
|
190
|
+
}
|
|
191
|
+
if (updates.priorityId !== undefined) {
|
|
192
|
+
fields.priority = { id: updates.priorityId };
|
|
193
|
+
}
|
|
194
|
+
if (updates.labels !== undefined) {
|
|
195
|
+
fields.labels = updates.labels;
|
|
196
|
+
}
|
|
197
|
+
await jiraRequest(buildApiPath(`/issue/${issueIdOrKey}`), {
|
|
198
|
+
method: 'PUT',
|
|
199
|
+
body: JSON.stringify({ fields }),
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
export const addComment = async (issueIdOrKey, commentText, visibility) => {
|
|
203
|
+
const apiVersion = getJiraApiVersion();
|
|
204
|
+
const body = {
|
|
205
|
+
body: apiVersion === '3' ? mdToAdf(commentText) : commentText,
|
|
206
|
+
};
|
|
207
|
+
if (visibility) {
|
|
208
|
+
body.visibility = visibility;
|
|
209
|
+
}
|
|
210
|
+
return jiraRequest(buildApiPath(`/issue/${issueIdOrKey}/comment`), {
|
|
211
|
+
method: 'POST',
|
|
212
|
+
body: JSON.stringify(body),
|
|
213
|
+
});
|
|
214
|
+
};
|
|
67
215
|
//# sourceMappingURL=jira.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira.service.js","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"jira.service.js","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAclF,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAA;IAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC1B,OAAO,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAA;IAClD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAA;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,OAAO,aAAa,OAAO,GAAG,QAAQ,EAAE,CAAA;AAC1C,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,QAAgB,EAAE,UAAuB,EAAE;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;QAC3C,GAAG,OAAO;QACV,OAAO,EAAE;YACP,GAAG,gBAAgB,EAAE;YACrB,MAAM,EAAE,kBAAkB;YAC1B,cAAc,EAAE,kBAAkB;YAClC,GAAG,OAAO,CAAC,OAAO;SACnB;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACvC,IAAI,aAAa,GAAG,uCAAuC,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAA;QAE1F,sCAAsC;QACtC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAGrC,CAAA;YAED,IAAI,SAAS,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjE,aAAa,IAAI,gCAAgC,CAAA;gBACjD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE;oBAC5D,aAAa,IAAI,SAAS,KAAK,KAAK,OAAO,EAAE,CAAA;gBAC/C,CAAC,CAAC,CAAA;gBACF,aAAa,IAAI,mFAAmF,CAAA;YACtG,CAAC;YAED,IAAI,SAAS,CAAC,aAAa,IAAI,SAAS,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClE,aAAa,IAAI,qBAAqB,CAAA;gBACtC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;oBACtC,aAAa,IAAI,SAAS,GAAG,EAAE,CAAA;gBACjC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;IAChC,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,SAAc,CAAA;IACvB,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAO,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,YAAoB,EAAE,MAAiB,EAAE,MAAiB,EAAE,EAAE;IACrF,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IACpC,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,IAAI,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IAClD,OAAO,WAAW,CAAY,GAAG,YAAY,CAAC,UAAU,YAAY,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AACjG,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,UAAU,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,EAAE,MAAiB,EAAE,aAAsB,EAAE,EAAE;IACjH,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;IAEtC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,qCAAqC;QACrC,OAAO,WAAW,CAA0B,YAAY,CAAC,aAAa,CAAC,EAAE;YACvE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG;gBACH,UAAU;gBACV,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;gBACnD,GAAG,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,CAAC;aACxC,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,mCAAmC;QACnC,OAAO,WAAW,CAAkB,YAAY,CAAC,SAAS,CAAC,EAAE;YAC3D,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;SACxG,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE;IACnD,OAAO,WAAW,CAChB,GAAG,YAAY,CAAC,iBAAiB,CAAC,+BAA+B,UAAU,EAAE,CAC9E,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,OAAO,WAAW,CAAsB,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;AAClE,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,YAAoB,EAAE,EAAE;IAC3D,OAAO,WAAW,CAA0B,YAAY,CAAC,UAAU,YAAY,cAAc,CAAC,CAAC,CAAA;AACjG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,YAAoB,EAAE,YAAoB,EAAE,OAAgB,EAAE,EAAE;IACnG,MAAM,IAAI,GAA4B,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,CAAA;IAC1E,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAA;IACzD,CAAC;IACD,MAAM,WAAW,CAAO,YAAY,CAAC,UAAU,YAAY,cAAc,CAAC,EAAE;QAC1E,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,YAAoB,EAAE,UAAkB,EAA+B,EAAE;IACpH,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC,CAAA;IACzD,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA;IACzG,OAAO,UAAU,EAAE,EAAE,CAAA;AACvB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,UAAmB,EAAE,WAAoB,EAAE,EAAE;IACnF,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IACpC,IAAI,UAAU;QAAE,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;IACrD,IAAI,WAAW;QAAE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;IACxD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,4BAA4B,CAAC,CAAA;IAElD,OAAO,WAAW,CAAqB,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;AACrG,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,MASjC,EAAoC,EAAE;IACrC,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;IAEtC,MAAM,IAAI,GAA4B;QACpC,MAAM,EAAE;YACN,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;YACnC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB;KACF,CAAA;IAED,kDAAkD;IAClD,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;YACvC,IAAI,GAAG,EAAE,CAAC;gBACR,CAAC;gBAAC,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,GAAG,CAAA;YAC7D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,CAAC;YAAC,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAA;QAC5E,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;QAAC,IAAI,CAAC,MAAkC,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,CAAC;QAAC,IAAI,CAAC,MAAkC,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAA;IAChF,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,CAAC;QAAC,IAAI,CAAC,MAAkC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAClE,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,CAAC;QAAC,IAAI,CAAC,MAAkC,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,CAAA;IAC9E,CAAC;IAED,OAAO,WAAW,CAA0B,YAAY,CAAC,QAAQ,CAAC,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,YAAoB,EACpB,OAMC,EACc,EAAE;IACjB,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;IACtC,MAAM,MAAM,GAA4B,EAAE,CAAA;IAE1C,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAClC,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;YACxC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,WAAW,GAAG,GAAG,CAAA;YAC1B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;QAC1C,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,gDAAgD;QAChD,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;IAC1E,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,CAAA;IAC9C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAChC,CAAC;IAED,MAAM,WAAW,CAAO,YAAY,CAAC,UAAU,YAAY,EAAE,CAAC,EAAE;QAC9D,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,YAAoB,EACpB,WAAmB,EACnB,UAAsD,EAChC,EAAE;IACxB,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;IAEtC,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW;KAC9D,CAAA;IAED,IAAI,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;IAED,OAAO,WAAW,CAAc,YAAY,CAAC,UAAU,YAAY,UAAU,CAAC,EAAE;QAC9E,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;AACJ,CAAC,CAAA"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ADFDocument } from 'extended-markdown-adf-parser';
|
|
1
2
|
export interface JiraIssue {
|
|
2
3
|
id: string;
|
|
3
4
|
key: string;
|
|
@@ -8,8 +9,9 @@ export interface JiraIssue {
|
|
|
8
9
|
};
|
|
9
10
|
assignee?: {
|
|
10
11
|
displayName?: string;
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
accountId?: string;
|
|
13
|
+
} | null;
|
|
14
|
+
description?: string | ADFDocument;
|
|
13
15
|
};
|
|
14
16
|
expand?: string;
|
|
15
17
|
}
|
|
@@ -20,6 +22,18 @@ export interface JiraJqlResponse {
|
|
|
20
22
|
total: number;
|
|
21
23
|
issues: JiraIssue[];
|
|
22
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Enhanced JQL search response (v3 /search/jql endpoint)
|
|
27
|
+
* Uses nextPageToken instead of startAt for pagination
|
|
28
|
+
*/
|
|
29
|
+
export interface JiraEnhancedJqlResponse {
|
|
30
|
+
expand?: string;
|
|
31
|
+
maxResults: number;
|
|
32
|
+
isLast: boolean;
|
|
33
|
+
nextPageToken?: string;
|
|
34
|
+
issues: JiraIssue[];
|
|
35
|
+
total?: number;
|
|
36
|
+
}
|
|
23
37
|
export interface JiraProject {
|
|
24
38
|
id: string;
|
|
25
39
|
key: string;
|
|
@@ -38,8 +52,10 @@ export interface JiraProfileResponse {
|
|
|
38
52
|
key: string;
|
|
39
53
|
accountId: string;
|
|
40
54
|
name: string;
|
|
41
|
-
emailAddress: string;
|
|
55
|
+
emailAddress: string | null;
|
|
42
56
|
displayName: string;
|
|
57
|
+
timeZone?: string | null;
|
|
58
|
+
locale?: string | null;
|
|
43
59
|
}
|
|
44
60
|
export interface JiraTransition {
|
|
45
61
|
id: string;
|
|
@@ -53,4 +69,76 @@ export interface JiraTransitionsResponse {
|
|
|
53
69
|
expand?: string;
|
|
54
70
|
transitions: JiraTransition[];
|
|
55
71
|
}
|
|
72
|
+
export interface JiraCreateIssueResponse {
|
|
73
|
+
id: string;
|
|
74
|
+
key: string;
|
|
75
|
+
self: string;
|
|
76
|
+
transition?: {
|
|
77
|
+
status: number;
|
|
78
|
+
errorCollection: {
|
|
79
|
+
errorMessages: string[];
|
|
80
|
+
errors: Record<string, string>;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export interface JiraComment {
|
|
85
|
+
id: string;
|
|
86
|
+
self: string;
|
|
87
|
+
author: {
|
|
88
|
+
accountId: string;
|
|
89
|
+
displayName: string;
|
|
90
|
+
emailAddress?: string | null;
|
|
91
|
+
};
|
|
92
|
+
body: string | ADFDocument;
|
|
93
|
+
created: string;
|
|
94
|
+
updated: string;
|
|
95
|
+
updateAuthor: {
|
|
96
|
+
accountId: string;
|
|
97
|
+
displayName: string;
|
|
98
|
+
};
|
|
99
|
+
visibility?: {
|
|
100
|
+
type: string;
|
|
101
|
+
value: string;
|
|
102
|
+
identifier: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export interface JiraIssueType {
|
|
106
|
+
id: string;
|
|
107
|
+
name: string;
|
|
108
|
+
description?: string;
|
|
109
|
+
subtask: boolean;
|
|
110
|
+
}
|
|
111
|
+
export interface JiraFieldSchema {
|
|
112
|
+
type: string;
|
|
113
|
+
system?: string;
|
|
114
|
+
items?: string;
|
|
115
|
+
custom?: string;
|
|
116
|
+
}
|
|
117
|
+
export interface JiraFieldMetadata {
|
|
118
|
+
required: boolean;
|
|
119
|
+
name: string;
|
|
120
|
+
schema: JiraFieldSchema;
|
|
121
|
+
key?: string;
|
|
122
|
+
hasDefaultValue?: boolean;
|
|
123
|
+
operations?: string[];
|
|
124
|
+
allowedValues?: Array<{
|
|
125
|
+
id?: string;
|
|
126
|
+
name?: string;
|
|
127
|
+
value?: string;
|
|
128
|
+
}>;
|
|
129
|
+
}
|
|
130
|
+
export interface JiraCreateMetadata {
|
|
131
|
+
projects: Array<{
|
|
132
|
+
id: string;
|
|
133
|
+
key: string;
|
|
134
|
+
name: string;
|
|
135
|
+
issuetypes: Array<{
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
description?: string;
|
|
139
|
+
subtask: boolean;
|
|
140
|
+
fields: Record<string, JiraFieldMetadata>;
|
|
141
|
+
}>;
|
|
142
|
+
}>;
|
|
143
|
+
}
|
|
56
144
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAE/D,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,CAAC;YAAC,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;QAC9D,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACnC,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;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;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,GAAG,IAAI,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;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;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE;QACX,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE;YACf,aAAa,EAAE,MAAM,EAAE,CAAA;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;SAC/B,CAAA;KACF,CAAA;CACF;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAC7B,CAAA;IACD,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,UAAU,CAAC,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,eAAe,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,KAAK,CAAC;QACpB,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAC,CAAA;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAA;QACV,GAAG,EAAE,MAAM,CAAA;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,KAAK,CAAC;YAChB,EAAE,EAAE,MAAM,CAAA;YACV,IAAI,EAAE,MAAM,CAAA;YACZ,WAAW,CAAC,EAAE,MAAM,CAAA;YACpB,OAAO,EAAE,OAAO,CAAA;YAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;SAC1C,CAAC,CAAA;KACH,CAAC,CAAA;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-comment.d.ts","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,SAiCpD,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getJiraBaseUrl } from '../lib/jira-env.js';
|
|
4
|
+
import { addComment } from '../lib/jira.service.js';
|
|
5
|
+
export const registerAddCommentTool = (server) => registerTool(server, {
|
|
6
|
+
name: 'add-comment',
|
|
7
|
+
title: 'Add Comment to Jira Issue',
|
|
8
|
+
description: 'Add a comment to an existing Jira issue.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
issueIdOrKey: z.string().describe('Issue key or ID (e.g., "PROJ-123")'),
|
|
11
|
+
comment: z.string().describe('Comment text (supports Markdown formatting in API v3, plain text in v2)'),
|
|
12
|
+
visibility: z
|
|
13
|
+
.object({
|
|
14
|
+
type: z.enum(['role', 'group']).describe('Visibility type: role or group'),
|
|
15
|
+
value: z.string().describe('Role name or group name'),
|
|
16
|
+
})
|
|
17
|
+
.optional()
|
|
18
|
+
.describe('Restrict comment visibility to a specific role or group (optional)'),
|
|
19
|
+
},
|
|
20
|
+
outputSchema: {
|
|
21
|
+
commentId: z.string(),
|
|
22
|
+
created: z.string(),
|
|
23
|
+
url: z.string(),
|
|
24
|
+
},
|
|
25
|
+
isReadOnly: false,
|
|
26
|
+
async fetcher(params) {
|
|
27
|
+
const comment = await addComment(params.issueIdOrKey, params.comment, params.visibility);
|
|
28
|
+
return { comment, issueIdOrKey: params.issueIdOrKey };
|
|
29
|
+
},
|
|
30
|
+
formatter(data) {
|
|
31
|
+
return {
|
|
32
|
+
commentId: data.comment.id,
|
|
33
|
+
created: data.comment.created,
|
|
34
|
+
url: `${getJiraBaseUrl()}/browse/${data.issueIdOrKey}?focusedCommentId=${data.comment.id}`,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=add-comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-comment.js","sourceRoot":"","sources":["../../src/tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,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,2BAA2B;IAClC,WAAW,EAAE,0CAA0C;IACvD,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yEAAyE,CAAC;QACvG,UAAU,EAAE,CAAC;aACV,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC1E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;SACtD,CAAC;aACD,QAAQ,EAAE;aACV,QAAQ,CAAC,oEAAoE,CAAC;KAClF;IACD,YAAY,EAAE;QACZ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;KAChB;IACD,UAAU,EAAE,KAAK;IACjB,KAAK,CAAC,OAAO,CAAC,MAAM;QAClB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QACxF,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAA;IACvD,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,GAAG,EAAE,GAAG,cAAc,EAAE,WAAW,IAAI,CAAC,YAAY,qBAAqB,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;SAC3F,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.d.ts","sourceRoot":"","sources":["../../src/tools/create-issue.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,uBAAuB,GAAI,QAAQ,SAAS,SA4CrD,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getJiraBaseUrl } from '../lib/jira-env.js';
|
|
4
|
+
import { createIssue } from '../lib/jira.service.js';
|
|
5
|
+
export const registerCreateIssueTool = (server) => registerTool(server, {
|
|
6
|
+
name: 'create-issue',
|
|
7
|
+
title: 'Create Jira Issue',
|
|
8
|
+
description: 'Create a new Jira issue. Use get-create-metadata to find valid issueTypeId and priorityId values for your project.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
projectKey: z.string().describe('Project key (e.g., "PROJ")'),
|
|
11
|
+
issueTypeId: z.string().describe('Issue type ID (use get-create-metadata to find valid IDs)'),
|
|
12
|
+
summary: z.string().describe('Issue title/summary'),
|
|
13
|
+
description: z
|
|
14
|
+
.string()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Issue description (supports Markdown formatting in API v3, plain text in v2)'),
|
|
17
|
+
assigneeId: z.string().optional().describe('Assignee account ID (leave empty for unassigned)'),
|
|
18
|
+
priorityId: z.string().optional().describe('Priority ID (use get-create-metadata to find valid IDs)'),
|
|
19
|
+
labels: z.array(z.string()).optional().describe('Labels for the issue'),
|
|
20
|
+
parentKey: z.string().optional().describe('Parent issue key (required for creating subtasks)'),
|
|
21
|
+
},
|
|
22
|
+
outputSchema: {
|
|
23
|
+
id: z.string(),
|
|
24
|
+
key: z.string(),
|
|
25
|
+
url: z.string(),
|
|
26
|
+
},
|
|
27
|
+
isReadOnly: false,
|
|
28
|
+
async fetcher(params) {
|
|
29
|
+
return createIssue({
|
|
30
|
+
projectKey: params.projectKey,
|
|
31
|
+
issueTypeId: params.issueTypeId,
|
|
32
|
+
summary: params.summary,
|
|
33
|
+
description: params.description,
|
|
34
|
+
assigneeId: params.assigneeId,
|
|
35
|
+
priorityId: params.priorityId,
|
|
36
|
+
labels: params.labels,
|
|
37
|
+
parentKey: params.parentKey,
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
formatter(data) {
|
|
41
|
+
return {
|
|
42
|
+
id: data.id,
|
|
43
|
+
key: data.key,
|
|
44
|
+
url: `${getJiraBaseUrl()}/browse/${data.key}`,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=create-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/tools/create-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAIpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAiB,EAAE,EAAE,CAC3D,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,oHAAoH;IACtH,WAAW,EAAE;QACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;QAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8EAA8E,CAAC;QAC3F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;QAC9F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACrG,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QACvE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC/F;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;KAChB;IACD,UAAU,EAAE,KAAK;IACjB,KAAK,CAAC,OAAO,CAAC,MAAM;QAClB,OAAO,WAAW,CAAC;YACjB,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAA;IACJ,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,GAAG,cAAc,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE;SAC9C,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-jql.d.ts","sourceRoot":"","sources":["../../src/tools/execute-jql.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"execute-jql.d.ts","sourceRoot":"","sources":["../../src/tools/execute-jql.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,SAuEpD,CAAA"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
+
import { getJiraApiVersion } from '../lib/jira-env.js';
|
|
3
4
|
import { executeJql } from '../lib/jira.service.js';
|
|
4
5
|
export const registerExecuteJqlTool = (server) => registerTool(server, {
|
|
5
6
|
name: 'execute-jql',
|
|
6
7
|
title: 'Execute Jira JQL',
|
|
7
|
-
description: 'Execute a Jira Query Language (JQL) search and return issues.',
|
|
8
|
+
description: 'Execute a Jira Query Language (JQL) search and return issues. In API v3, uses enhanced search with nextPageToken pagination. In API v2, uses legacy search with startAt pagination.',
|
|
8
9
|
inputSchema: {
|
|
9
10
|
jql: z.string().describe('JQL query string'),
|
|
10
11
|
maxResults: z
|
|
@@ -14,14 +15,22 @@ export const registerExecuteJqlTool = (server) => registerTool(server, {
|
|
|
14
15
|
.max(100)
|
|
15
16
|
.optional()
|
|
16
17
|
.describe('Maximum number of results to return (default: 50)'),
|
|
17
|
-
startAt: z
|
|
18
|
+
startAt: z
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.min(0)
|
|
22
|
+
.optional()
|
|
23
|
+
.describe('Index of first result for pagination (v2 only, default: 0)'),
|
|
24
|
+
nextPageToken: z.string().optional().describe('Token for next page of results (v3 only)'),
|
|
18
25
|
fields: z
|
|
19
26
|
.array(z.string())
|
|
20
27
|
.optional()
|
|
21
28
|
.describe('Fields to include in results (default: [summary, status, assignee])'),
|
|
22
29
|
},
|
|
23
30
|
outputSchema: {
|
|
24
|
-
total: z.number(),
|
|
31
|
+
total: z.number().optional(), // Not always present in v3
|
|
32
|
+
isLast: z.boolean().optional(), // Only in v3
|
|
33
|
+
nextPageToken: z.string().optional(), // Only in v3
|
|
25
34
|
issues: z.array(z.object({
|
|
26
35
|
key: z.string(),
|
|
27
36
|
summary: z.string().optional(),
|
|
@@ -30,17 +39,35 @@ export const registerExecuteJqlTool = (server) => registerTool(server, {
|
|
|
30
39
|
},
|
|
31
40
|
isReadOnly: true,
|
|
32
41
|
async fetcher(params) {
|
|
33
|
-
return executeJql(params.jql, params.maxResults, params.startAt, params.fields);
|
|
42
|
+
return executeJql(params.jql, params.maxResults, params.startAt, params.fields, params.nextPageToken);
|
|
34
43
|
},
|
|
35
44
|
formatter(data) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
45
|
+
const apiVersion = getJiraApiVersion();
|
|
46
|
+
// Handle both v2 and v3 responses
|
|
47
|
+
if (apiVersion === '3' && 'isLast' in data) {
|
|
48
|
+
// v3 enhanced search response
|
|
49
|
+
return {
|
|
50
|
+
isLast: data.isLast,
|
|
51
|
+
nextPageToken: data.nextPageToken,
|
|
52
|
+
total: data.total,
|
|
53
|
+
issues: data.issues.map((issue) => ({
|
|
54
|
+
key: issue.key,
|
|
55
|
+
summary: issue.fields.summary,
|
|
56
|
+
status: issue.fields.status?.name,
|
|
57
|
+
})),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// v2 legacy search response
|
|
62
|
+
return {
|
|
63
|
+
total: data.total,
|
|
64
|
+
issues: data.issues.map((issue) => ({
|
|
65
|
+
key: issue.key,
|
|
66
|
+
summary: issue.fields.summary,
|
|
67
|
+
status: issue.fields.status?.name,
|
|
68
|
+
})),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
44
71
|
},
|
|
45
72
|
});
|
|
46
73
|
//# sourceMappingURL=execute-jql.js.map
|
|
@@ -1 +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,
|
|
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,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtD,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,EACT,qLAAqL;IACvL,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;aACP,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,EAAE;aACV,QAAQ,CAAC,4DAA4D,CAAC;QACzE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACzF,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,CAAC,QAAQ,EAAE,EAAE,2BAA2B;QACzD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa;QAC7C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa;QACnD,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,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;IACvG,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAA;QAEtC,kCAAkC;QAClC,IAAI,UAAU,KAAK,GAAG,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3C,8BAA8B;YAC9B,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAClC,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;oBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;iBAClC,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAClC,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;oBAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI;iBAClC,CAAC,CAAC;aACJ,CAAA;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-create-metadata.d.ts","sourceRoot":"","sources":["../../src/tools/get-create-metadata.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,6BAA6B,GAAI,QAAQ,SAAS,SA+D3D,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getCreateMetadata } from '../lib/jira.service.js';
|
|
4
|
+
export const registerGetCreateMetadataTool = (server) => registerTool(server, {
|
|
5
|
+
name: 'get-create-metadata',
|
|
6
|
+
title: 'Get Jira Create Issue Metadata',
|
|
7
|
+
description: 'Get metadata about fields required to create issues in a project. Returns issue types, priorities, and field requirements. Use this to find valid issueTypeId and priorityId values for creating issues.',
|
|
8
|
+
inputSchema: {
|
|
9
|
+
projectKey: z.string().optional().describe('Filter by project key (e.g., "PROJ")'),
|
|
10
|
+
issueTypeId: z.string().optional().describe('Filter by specific issue type ID'),
|
|
11
|
+
},
|
|
12
|
+
outputSchema: {
|
|
13
|
+
projects: z.array(z.object({
|
|
14
|
+
key: z.string(),
|
|
15
|
+
name: z.string(),
|
|
16
|
+
issueTypes: z.array(z.object({
|
|
17
|
+
id: z.string(),
|
|
18
|
+
name: z.string(),
|
|
19
|
+
subtask: z.boolean(),
|
|
20
|
+
requiredFields: z.array(z.string()),
|
|
21
|
+
availablePriorities: z.array(z.object({ id: z.string(), name: z.string() })).optional(),
|
|
22
|
+
})),
|
|
23
|
+
})),
|
|
24
|
+
},
|
|
25
|
+
isReadOnly: true,
|
|
26
|
+
async fetcher(params) {
|
|
27
|
+
return getCreateMetadata(params.projectKey, params.issueTypeId);
|
|
28
|
+
},
|
|
29
|
+
formatter(data) {
|
|
30
|
+
// Filter response to only show essential information
|
|
31
|
+
return {
|
|
32
|
+
projects: data.projects.map((project) => ({
|
|
33
|
+
key: project.key,
|
|
34
|
+
name: project.name,
|
|
35
|
+
issueTypes: project.issuetypes.map((issueType) => {
|
|
36
|
+
const fields = issueType.fields;
|
|
37
|
+
// Extract required fields
|
|
38
|
+
const requiredFields = Object.entries(fields)
|
|
39
|
+
.filter(([, meta]) => meta.required)
|
|
40
|
+
.map(([key]) => key);
|
|
41
|
+
// Extract priorities if available
|
|
42
|
+
const priorityField = fields.priority;
|
|
43
|
+
const availablePriorities = priorityField?.allowedValues?.map((p) => ({
|
|
44
|
+
id: p.id ?? '',
|
|
45
|
+
name: p.name ?? '',
|
|
46
|
+
}));
|
|
47
|
+
return {
|
|
48
|
+
id: issueType.id,
|
|
49
|
+
name: issueType.name,
|
|
50
|
+
subtask: issueType.subtask,
|
|
51
|
+
requiredFields,
|
|
52
|
+
...(availablePriorities && availablePriorities.length > 0 && { availablePriorities }),
|
|
53
|
+
};
|
|
54
|
+
}),
|
|
55
|
+
})),
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=get-create-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-create-metadata.js","sourceRoot":"","sources":["../../src/tools/get-create-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export const registerGetCurrentProfileTool = (server) => registerTool(server, {
|
|
|
8
8
|
inputSchema: {},
|
|
9
9
|
outputSchema: {
|
|
10
10
|
displayName: z.string(),
|
|
11
|
-
emailAddress: z.string(),
|
|
11
|
+
emailAddress: z.string().nullable(),
|
|
12
12
|
accountId: z.string(),
|
|
13
13
|
},
|
|
14
14
|
isReadOnly: true,
|
|
@@ -1 +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;
|
|
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,CAAC,QAAQ,EAAE;QACnC,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-issue.d.ts","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-issue.d.ts","sourceRoot":"","sources":["../../src/tools/get-issue.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,SAAS,SA8BlD,CAAA"}
|
package/dist/tools/get-issue.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
+
import { adfToMd } from '../lib/adf-utils.js';
|
|
3
4
|
import { getIssue } from '../lib/jira.service.js';
|
|
4
5
|
export const registerGetIssueTool = (server) => registerTool(server, {
|
|
5
6
|
name: 'get-issue',
|
|
@@ -15,7 +16,7 @@ export const registerGetIssueTool = (server) => registerTool(server, {
|
|
|
15
16
|
summary: z.string().optional(),
|
|
16
17
|
status: z.string().optional(),
|
|
17
18
|
assignee: z.string().optional(),
|
|
18
|
-
description: z.string().optional(),
|
|
19
|
+
description: z.string().optional(), // Always markdown (converted from ADF in v3)
|
|
19
20
|
},
|
|
20
21
|
isReadOnly: true,
|
|
21
22
|
async fetcher({ issueIdOrKey, fields, expand }) {
|
|
@@ -27,7 +28,7 @@ export const registerGetIssueTool = (server) => registerTool(server, {
|
|
|
27
28
|
summary: data.fields.summary,
|
|
28
29
|
status: data.fields.status?.name,
|
|
29
30
|
assignee: data.fields.assignee?.displayName,
|
|
30
|
-
description: data.fields.description,
|
|
31
|
+
description: adfToMd(data.fields.description), // Convert ADF to Markdown
|
|
31
32
|
};
|
|
32
33
|
},
|
|
33
34
|
});
|
|
@@ -1 +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;
|
|
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,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,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,EAAE,6CAA6C;KAClF;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,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,0BAA0B;SAC1E,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-issue.d.ts","sourceRoot":"","sources":["../../src/tools/update-issue.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,uBAAuB,GAAI,QAAQ,SAAS,SAuCrD,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { registerTool } from '@mcp-monorepo/shared';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getJiraBaseUrl } from '../lib/jira-env.js';
|
|
4
|
+
import { updateIssue } from '../lib/jira.service.js';
|
|
5
|
+
export const registerUpdateIssueTool = (server) => registerTool(server, {
|
|
6
|
+
name: 'update-issue',
|
|
7
|
+
title: 'Update Jira Issue',
|
|
8
|
+
description: 'Update fields of an existing Jira issue. Only provided fields will be updated, others remain unchanged.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
issueIdOrKey: z.string().describe('Issue key or ID (e.g., "PROJ-123")'),
|
|
11
|
+
summary: z.string().optional().describe('New issue title/summary'),
|
|
12
|
+
description: z
|
|
13
|
+
.string()
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('New description (supports Markdown formatting in API v3, plain text in v2)'),
|
|
16
|
+
assigneeId: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.nullable()
|
|
20
|
+
.describe('Assignee account ID (null to unassign, undefined to leave unchanged)'),
|
|
21
|
+
priorityId: z.string().optional().describe('New priority ID'),
|
|
22
|
+
labels: z.array(z.string()).optional().describe('New labels (replaces existing labels)'),
|
|
23
|
+
},
|
|
24
|
+
outputSchema: {
|
|
25
|
+
success: z.boolean(),
|
|
26
|
+
issueKey: z.string(),
|
|
27
|
+
url: z.string(),
|
|
28
|
+
},
|
|
29
|
+
isReadOnly: false,
|
|
30
|
+
async fetcher(params) {
|
|
31
|
+
const { issueIdOrKey, ...updates } = params;
|
|
32
|
+
await updateIssue(issueIdOrKey, updates);
|
|
33
|
+
return { issueIdOrKey };
|
|
34
|
+
},
|
|
35
|
+
formatter(data) {
|
|
36
|
+
return {
|
|
37
|
+
success: true,
|
|
38
|
+
issueKey: data.issueIdOrKey,
|
|
39
|
+
url: `${getJiraBaseUrl()}/browse/${data.issueIdOrKey}`,
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=update-issue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-issue.js","sourceRoot":"","sources":["../../src/tools/update-issue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAIpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,MAAiB,EAAE,EAAE,CAC3D,YAAY,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,mBAAmB;IAC1B,WAAW,EACT,yGAAyG;IAC3G,WAAW,EAAE;QACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;QACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QAClE,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,4EAA4E,CAAC;QACzF,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,EAAE;aACV,QAAQ,CAAC,sEAAsE,CAAC;QACnF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACzF;IACD,YAAY,EAAE;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;QACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;KAChB;IACD,UAAU,EAAE,KAAK;IACjB,KAAK,CAAC,OAAO,CAAC,MAAM;QAClB,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,EAAE,GAAG,MAAM,CAAA;QAC3C,MAAM,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;QACxC,OAAO,EAAE,YAAY,EAAE,CAAA;IACzB,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,OAAO;YACL,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,GAAG,EAAE,GAAG,cAAc,EAAE,WAAW,IAAI,CAAC,YAAY,EAAE;SACvD,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-monorepo/jira",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "MCP server for Jira tools (JQL, issue management, etc.).",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@mcp-monorepo/shared": "1.2.0",
|
|
28
28
|
"@modelcontextprotocol/sdk": "^1.25.1",
|
|
29
|
+
"extended-markdown-adf-parser": "^2.4.0",
|
|
29
30
|
"zod": "^4.2.1"
|
|
30
31
|
},
|
|
31
32
|
"devDependencies": {
|