@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.
Files changed (42) hide show
  1. package/README.md +80 -8
  2. package/dist/index.js +18 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/adf-utils.d.ts +19 -0
  5. package/dist/lib/adf-utils.d.ts.map +1 -0
  6. package/dist/lib/adf-utils.js +52 -0
  7. package/dist/lib/adf-utils.js.map +1 -0
  8. package/dist/lib/jira-env.d.ts +2 -0
  9. package/dist/lib/jira-env.d.ts.map +1 -1
  10. package/dist/lib/jira-env.js +7 -0
  11. package/dist/lib/jira-env.js.map +1 -1
  12. package/dist/lib/jira.service.d.ts +29 -2
  13. package/dist/lib/jira.service.d.ts.map +1 -1
  14. package/dist/lib/jira.service.js +160 -12
  15. package/dist/lib/jira.service.js.map +1 -1
  16. package/dist/lib/types.d.ts +91 -3
  17. package/dist/lib/types.d.ts.map +1 -1
  18. package/dist/tools/add-comment.d.ts +3 -0
  19. package/dist/tools/add-comment.d.ts.map +1 -0
  20. package/dist/tools/add-comment.js +38 -0
  21. package/dist/tools/add-comment.js.map +1 -0
  22. package/dist/tools/create-issue.d.ts +3 -0
  23. package/dist/tools/create-issue.d.ts.map +1 -0
  24. package/dist/tools/create-issue.js +48 -0
  25. package/dist/tools/create-issue.js.map +1 -0
  26. package/dist/tools/execute-jql.d.ts.map +1 -1
  27. package/dist/tools/execute-jql.js +39 -12
  28. package/dist/tools/execute-jql.js.map +1 -1
  29. package/dist/tools/get-create-metadata.d.ts +3 -0
  30. package/dist/tools/get-create-metadata.d.ts.map +1 -0
  31. package/dist/tools/get-create-metadata.js +59 -0
  32. package/dist/tools/get-create-metadata.js.map +1 -0
  33. package/dist/tools/get-current-profile.js +1 -1
  34. package/dist/tools/get-current-profile.js.map +1 -1
  35. package/dist/tools/get-issue.d.ts.map +1 -1
  36. package/dist/tools/get-issue.js +3 -2
  37. package/dist/tools/get-issue.js.map +1 -1
  38. package/dist/tools/update-issue.d.ts +3 -0
  39. package/dist/tools/update-issue.d.ts.map +1 -0
  40. package/dist/tools/update-issue.js +43 -0
  41. package/dist/tools/update-issue.js.map +1 -0
  42. 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-18T09:43:33.221Z
4
+ Last generated: 2026-02-18T12:57:56.494Z
5
5
  -->
6
6
 
7
7
  # @mcp-monorepo/jira
8
8
 
9
- ![version](https://img.shields.io/badge/version-1.2.0-blue) ![repo](https://img.shields.io/badge/monorepo-source-blue?logo=github&link=https%3A%2F%2Fgithub.com%2FCaesar2011%2Fmcp-monorepo%2Ftree%2Fmain%2Fpackages%2Fjira)
9
+ ![version](https://img.shields.io/badge/version-1.3.0-blue) ![repo](https://img.shields.io/badge/monorepo-source-blue?logo=github&link=https%3A%2F%2Fgithub.com%2FCaesar2011%2Fmcp-monorepo%2Ftree%2Fmain%2Fpackages%2Fjira)
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
- logger.info(`Successfully connected to Jira as "${profile.displayName}" (${profile.emailAddress}).`);
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;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzD,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,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;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,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAE3D,wFAAwF;QACxF,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;YAC3D,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAA;YACzC,MAAM,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,WAAW,MAAM,OAAO,CAAC,YAAY,IAAI,CAAC,CAAA;QACtG,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"}
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"}
@@ -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;AAE/F,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED,wBAAgB,eAAe,IAAI,YAAY,CAY9C"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"jira-env.js","sourceRoot":"","sources":["../../src/lib/jira-env.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,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"}
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
- export declare const executeJql: (jql: string, maxResults?: number, startAt?: number, fields?: string[]) => Promise<JiraJqlResponse>;
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":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAA;AAkCnB,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"}
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"}
@@ -1,4 +1,5 @@
1
- import { getJiraAuthMode, getJiraBaseUrl } from './jira-env.js';
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
- throw new Error(`Jira API request failed with status ${response.status}: ${errorText}`);
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(`/rest/api/2/issue/${issueIdOrKey}?${params.toString()}`);
61
+ return jiraRequest(`${buildApiPath(`/issue/${issueIdOrKey}`)}?${params.toString()}`);
36
62
  };
37
- export const executeJql = (jql, maxResults = 50, startAt = 0, fields) => {
38
- return jiraRequest('/rest/api/2/search', {
39
- method: 'POST',
40
- body: JSON.stringify({ jql, maxResults, startAt, fields: fields ?? ['summary', 'status', 'assignee'] }),
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(`/rest/api/2/project/search?orderBy=created&maxResults=${maxResults}`);
91
+ return jiraRequest(`${buildApiPath('/project/search')}?orderBy=created&maxResults=${maxResults}`);
45
92
  };
46
93
  export const getCurrentProfile = () => {
47
- return jiraRequest('/rest/api/2/myself');
94
+ return jiraRequest(buildApiPath('/myself'));
48
95
  };
49
96
  export const getTicketTransitions = (issueIdOrKey) => {
50
- return jiraRequest(`/rest/api/2/issue/${issueIdOrKey}/transitions`);
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(`/rest/api/2/issue/${issueIdOrKey}/transitions`, {
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":"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"}
1
+ {"version":3,"file":"jira.service.js","sourceRoot":"","sources":["../../src/lib/jira.service.ts"],"names":[],"mappings":"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"}
@@ -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
- description?: string;
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
@@ -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;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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const registerAddCommentTool: (server: McpServer) => void;
3
+ //# sourceMappingURL=add-comment.d.ts.map
@@ -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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const registerCreateIssueTool: (server: McpServer) => void;
3
+ //# sourceMappingURL=create-issue.d.ts.map
@@ -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":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,SA4CpD,CAAA"}
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.number().int().min(0).optional().describe('Index of first result for pagination (default: 0)'),
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
- 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
- };
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,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"}
1
+ {"version":3,"file":"execute-jql.js","sourceRoot":"","sources":["../../src/tools/execute-jql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const registerGetCreateMetadataTool: (server: McpServer) => void;
3
+ //# sourceMappingURL=get-create-metadata.d.ts.map
@@ -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":"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,gCAAgC;IACvC,WAAW,EACT,0MAA0M;IAC5M,WAAW,EAAE;QACX,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAClF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAChF;IACD,YAAY,EAAE;QACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;YACP,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAChB,UAAU,EAAE,CAAC,CAAC,KAAK,CACjB,CAAC,CAAC,MAAM,CAAC;gBACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;gBACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;gBACpB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBACnC,mBAAmB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;aACxF,CAAC,CACH;SACF,CAAC,CACH;KACF;IACD,UAAU,EAAE,IAAI;IAChB,KAAK,CAAC,OAAO,CAAC,MAAM;QAClB,OAAO,iBAAiB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IACjE,CAAC;IACD,SAAS,CAAC,IAAI;QACZ,qDAAqD;QACrD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACxC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;oBAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;oBAE/B,0BAA0B;oBAC1B,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;yBAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;yBACnC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;oBAEtB,kCAAkC;oBAClC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAA;oBACrC,MAAM,mBAAmB,GAAG,aAAa,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBACpE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE;wBACd,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;qBACnB,CAAC,CAAC,CAAA;oBAEH,OAAO;wBACL,EAAE,EAAE,SAAS,CAAC,EAAE;wBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,OAAO,EAAE,SAAS,CAAC,OAAO;wBAC1B,cAAc;wBACd,GAAG,CAAC,mBAAmB,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,mBAAmB,EAAE,CAAC;qBACtF,CAAA;gBACH,CAAC,CAAC;aACH,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -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;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"}
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":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAExE,eAAO,MAAM,oBAAoB,GAAI,QAAQ,SAAS,SA8BlD,CAAA"}
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"}
@@ -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;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"}
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,3 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare const registerUpdateIssueTool: (server: McpServer) => void;
3
+ //# sourceMappingURL=update-issue.d.ts.map
@@ -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.0",
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": {