@atlassian-dc-mcp/jira 0.26.0 → 0.28.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 (34) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +77 -0
  3. package/build/__tests__/jira-download.test.d.ts +2 -0
  4. package/build/__tests__/jira-download.test.d.ts.map +1 -0
  5. package/build/__tests__/jira-download.test.js +89 -0
  6. package/build/__tests__/jira-download.test.js.map +1 -0
  7. package/build/__tests__/jira-service.test.js +85 -1
  8. package/build/__tests__/jira-service.test.js.map +1 -1
  9. package/build/__tests__/jira-upload.test.d.ts +2 -0
  10. package/build/__tests__/jira-upload.test.d.ts.map +1 -0
  11. package/build/__tests__/jira-upload.test.js +58 -0
  12. package/build/__tests__/jira-upload.test.js.map +1 -0
  13. package/build/__tests__/response-body.test.d.ts +2 -0
  14. package/build/__tests__/response-body.test.d.ts.map +1 -0
  15. package/build/__tests__/response-body.test.js +34 -0
  16. package/build/__tests__/response-body.test.js.map +1 -0
  17. package/build/index.js +38 -2
  18. package/build/index.js.map +1 -1
  19. package/build/jira-client/core/request.d.ts.map +1 -1
  20. package/build/jira-client/core/request.js +5 -1
  21. package/build/jira-client/core/request.js.map +1 -1
  22. package/build/jira-service.d.ts +63 -0
  23. package/build/jira-service.d.ts.map +1 -1
  24. package/build/jira-service.js +126 -2
  25. package/build/jira-service.js.map +1 -1
  26. package/package.json +3 -3
  27. package/src/__tests__/jira-download.test.ts +111 -0
  28. package/src/__tests__/jira-service.test.ts +106 -1
  29. package/src/__tests__/jira-upload.test.ts +70 -0
  30. package/src/__tests__/response-body.test.ts +43 -0
  31. package/src/index.ts +77 -2
  32. package/src/jira-client/core/request.ts +5 -1
  33. package/src/jira-service.ts +170 -2
  34. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,35 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.28.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.27.0...v0.28.0) (2026-07-22)
7
+
8
+
9
+ ### Features
10
+
11
+ * add jira_uploadAttachment tool ([e19180f](https://github.com/b1ff/atlassian-dc-mcp/commit/e19180f9210c831f4827aa331a189fa4d3a72de7))
12
+ * **attachments:** sandbox local filesystem access behind an opt-in gateway ([2a22547](https://github.com/b1ff/atlassian-dc-mcp/commit/2a22547292a390a032642ad09bd09ede0808e9d7))
13
+ * **jira:** add jira_downloadAttachment tool ([31cbeef](https://github.com/b1ff/atlassian-dc-mcp/commit/31cbeefd00fde37b1245efbe975ea4d63db46758))
14
+
15
+
16
+
17
+
18
+
19
+ # [0.27.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.26.0...v0.27.0) (2026-07-18)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * **jira:** avoid JSON parse error on empty response bodies ([3c55b59](https://github.com/b1ff/atlassian-dc-mcp/commit/3c55b591bd75ad850d8952d566277ba151b905d2))
25
+
26
+
27
+ ### Features
28
+
29
+ * **jira:** add issue link and unlink tools ([217701e](https://github.com/b1ff/atlassian-dc-mcp/commit/217701ee570426c391999f4c8ec89d391977b84a))
30
+
31
+
32
+
33
+
34
+
6
35
  # [0.26.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.25.0...v0.26.0) (2026-07-04)
7
36
 
8
37
  **Note:** Version bump only for package @atlassian-dc-mcp/jira
package/README.md CHANGED
@@ -115,6 +115,7 @@ Alternatively, you can use `JIRA_API_BASE_PATH` instead of `JIRA_HOST` to specif
115
115
  - Get issue comments
116
116
  - Create and update issues
117
117
  - Add comments to issues
118
+ - Link and unlink issues
118
119
 
119
120
  ## Setup
120
121
 
@@ -137,6 +138,37 @@ Alternatively, you can use `JIRA_API_BASE_PATH` instead of `JIRA_HOST` to specif
137
138
 
138
139
  See [Configuration sources](#configuration-sources) for the full precedence chain.
139
140
 
141
+ ### Attachment filesystem access (opt-in)
142
+
143
+ By default this server is an API-only client: the attachment tools never read from or write to the local filesystem, and `jira_uploadAttachment` is **not even registered**. `jira_downloadAttachment` is always available but can only return file bytes inline (base64/text) — it cannot touch local disk.
144
+
145
+ Local filesystem access is opt-in and confined to operator-configured directories that the model cannot choose:
146
+
147
+ ```
148
+ # Enable each direction separately (default: false)
149
+ JIRA_ATTACHMENTS_UPLOAD_ENABLED=true
150
+ JIRA_ATTACHMENTS_DOWNLOAD_ENABLED=true
151
+
152
+ # Allowed roots (os path-separator list). Uploads may only read from these,
153
+ # downloads may only write into the first configured download root.
154
+ JIRA_ATTACHMENTS_UPLOAD_ROOTS=/srv/jira-exchange/in
155
+ JIRA_ATTACHMENTS_DOWNLOAD_ROOTS=/srv/jira-exchange/out
156
+
157
+ # Convenience: a single dedicated exchange directory used as both roots
158
+ JIRA_ATTACHMENTS_DIR=/srv/jira-exchange
159
+
160
+ # Hard per-file size limits in bytes (default: 25 MiB)
161
+ JIRA_ATTACHMENTS_MAX_UPLOAD_BYTES=26214400
162
+ JIRA_ATTACHMENTS_MAX_DOWNLOAD_BYTES=26214400
163
+ ```
164
+
165
+ Guardrails applied when enabled:
166
+ - A direction only activates when its flag is set **and** at least one root resolves; otherwise the tool stays disabled and a warning is logged.
167
+ - Roots are canonicalized (realpath) at startup. Requested paths are relative to a root; absolute paths and `..` segments are rejected, and a path that escapes a root through a symlinked directory is refused.
168
+ - Uploads reject symlinks and non-regular files (FIFOs, devices, directories).
169
+ - Downloads never overwrite an existing file (including a symlink) — they use an exclusive write.
170
+ - Both directions enforce the configured hard size limit.
171
+
140
172
  To create a personal access token:
141
173
  - In Jira, select your profile picture at the top right
142
174
  - Select **Personal Access Tokens**
@@ -247,3 +279,48 @@ Parameters:
247
279
  - `issueKey` (string, required): The issue key (e.g., "PROJECT-123")
248
280
  - `transitionId` (string, required): Transition ID returned by `jira_getTransitions`
249
281
  - `fields` (object, optional): Additional fields required by the transition screen
282
+
283
+ #### 9. jira_getIssueLinkTypes
284
+
285
+ Get the list of available issue link types (e.g., "Blocks", "Relates", "Duplicate") in the JIRA Data Center edition instance. Use this to discover valid link type names before calling `jira_linkIssues`.
286
+
287
+ Parameters: none
288
+
289
+ #### 10. jira_linkIssues
290
+
291
+ Create a link between two JIRA issues in the JIRA Data Center edition instance.
292
+
293
+ Parameters:
294
+ - `inwardIssueKey` (string, required): Key of the inward issue — the one the inward link description applies to (e.g., the issue that "is blocked by"). Example: "PROJECT-123"
295
+ - `outwardIssueKey` (string, required): Key of the outward issue — the one the outward link description applies to (e.g., the issue that "blocks"). Example: "PROJECT-456"
296
+ - `linkType` (string, required): Name of the issue link type to apply (e.g., "Blocks", "Relates"). Use `jira_getIssueLinkTypes` to discover valid names for this JIRA installation.
297
+ - `comment` (string, optional): Comment added to the inward issue when the link is created, in JIRA Wiki Markup
298
+
299
+ #### 11. jira_unlinkIssues
300
+
301
+ Delete an existing link between two JIRA issues in the JIRA Data Center edition instance.
302
+
303
+ Parameters:
304
+ - `linkId` (string, required): The id of the issue link to delete. Link ids are found in the `issuelinks` field of an issue (retrieve it via `jira_getIssue` with the `issuelinks` field).
305
+
306
+ #### 12. jira_uploadAttachment
307
+
308
+ Upload a local file as an attachment to a JIRA issue. Only registered when filesystem uploads are enabled (see [Attachment filesystem access](#attachment-filesystem-access-opt-in)).
309
+
310
+ Parameters:
311
+ - `issueKey` (string, required): The issue key (e.g., "PROJECT-123")
312
+ - `sourcePath` (string, required): Path to the file to upload, **relative to a server-configured upload directory**. Absolute paths and `..` segments are rejected; symlinks and non-regular files are refused.
313
+ - `filename` (string, optional): Override for the attachment filename (defaults to the basename of `sourcePath`)
314
+
315
+ #### 13. jira_downloadAttachment
316
+
317
+ Download attachment(s) from a JIRA issue, by issue key (optionally filtered by filename) or by a single attachment id. Returns the file content inline (base64 or text) — useful for inspecting a file or moving it elsewhere (e.g. re-uploading to a Confluence page). When filesystem downloads are enabled (see [Attachment filesystem access](#attachment-filesystem-access-opt-in)), it can also save into the server-configured download directory.
318
+
319
+ Parameters:
320
+ - `issueKey` (string, optional): The issue key (e.g., "PROJECT-123") whose attachment(s) to download. Provide either `issueKey` or `attachmentId`.
321
+ - `attachmentId` (string, optional): Numeric id of a single attachment to download. Provide either `attachmentId` or `issueKey`.
322
+ - `filename` (string, optional): When using `issueKey`, download only attachments with this exact filename. If omitted, all attachments on the issue are downloaded.
323
+ - `returnContent` (`none` | `base64` | `text`, optional): Whether to embed the file bytes in the response. Defaults to `none`.
324
+ - `maxInlineBytes` (number, optional): Maximum bytes to embed inline when `returnContent` is `base64`/`text`. Larger files are omitted from the inline content. Defaults to 1 MiB.
325
+ - `save` (boolean, optional): Save the attachment(s) into the server-configured download directory. Requires filesystem downloads to be enabled; existing files are never overwritten. *(Only available when downloads are enabled.)*
326
+ - `saveName` (string, optional): File name (no directories) to use when saving a single attachment; defaults to the attachment's own name. *(Only available when downloads are enabled.)*
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jira-download.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-download.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jira-download.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,89 @@
1
+ import { JiraService } from '../jira-service.js';
2
+ import { AttachmentService, IssueService } from '../jira-client/index.js';
3
+ const DISABLED_DOWNLOAD = { enabled: false, roots: [], maxBytes: 25 * 1024 * 1024 };
4
+ jest.mock('../jira-client/index.js', () => ({
5
+ AttachmentService: {
6
+ getAttachment: jest.fn(),
7
+ },
8
+ IssueService: {
9
+ getIssue: jest.fn(),
10
+ },
11
+ MyselfService: {},
12
+ SearchService: {},
13
+ OpenAPI: { BASE: '', TOKEN: '', VERSION: '' },
14
+ }));
15
+ function mockFetchText(text) {
16
+ global.fetch = jest.fn().mockResolvedValue({
17
+ ok: true,
18
+ status: 200,
19
+ statusText: 'OK',
20
+ headers: { get: () => 'text/plain' },
21
+ arrayBuffer: async () => Buffer.from(text),
22
+ });
23
+ }
24
+ describe('JiraService.downloadAttachments', () => {
25
+ let service;
26
+ beforeEach(() => {
27
+ service = new JiraService('test-host', 'test-token', undefined, () => 25);
28
+ jest.clearAllMocks();
29
+ });
30
+ afterEach(() => jest.restoreAllMocks());
31
+ it('downloads a single attachment by id using its content URL', async () => {
32
+ AttachmentService.getAttachment.mockResolvedValue({
33
+ id: '10001',
34
+ filename: 'report.pdf',
35
+ mimeType: 'application/pdf',
36
+ content: 'https://test-host/secure/attachment/10001/report.pdf',
37
+ });
38
+ mockFetchText('pdf-bytes');
39
+ const result = await service.downloadAttachments({ attachmentId: '10001', returnContent: 'text', downloadSide: DISABLED_DOWNLOAD });
40
+ expect(AttachmentService.getAttachment).toHaveBeenCalledWith('10001');
41
+ expect(global.fetch).toHaveBeenCalledWith('https://test-host/secure/attachment/10001/report.pdf', expect.objectContaining({ headers: expect.objectContaining({ Authorization: 'Bearer test-token' }) }));
42
+ expect(result.success).toBe(true);
43
+ expect(result.data).toMatchObject({ count: 1 });
44
+ expect(result.data.attachments[0]).toMatchObject({ filename: 'report.pdf', content: 'pdf-bytes' });
45
+ });
46
+ it('downloads all attachments on an issue', async () => {
47
+ IssueService.getIssue.mockResolvedValue({
48
+ fields: {
49
+ attachment: [
50
+ { id: '1', filename: 'a.txt', content: 'https://test-host/a' },
51
+ { id: '2', filename: 'b.txt', content: 'https://test-host/b' },
52
+ ],
53
+ },
54
+ });
55
+ mockFetchText('x');
56
+ const result = await service.downloadAttachments({ issueKey: 'PROJ-1', downloadSide: DISABLED_DOWNLOAD });
57
+ expect(IssueService.getIssue).toHaveBeenCalledWith('PROJ-1', undefined, ['attachment']);
58
+ expect(result.success).toBe(true);
59
+ expect(result.data.count).toBe(2);
60
+ });
61
+ it('filters issue attachments by filename', async () => {
62
+ IssueService.getIssue.mockResolvedValue({
63
+ fields: {
64
+ attachment: [
65
+ { id: '1', filename: 'a.txt', content: 'https://test-host/a' },
66
+ { id: '2', filename: 'b.txt', content: 'https://test-host/b' },
67
+ ],
68
+ },
69
+ });
70
+ mockFetchText('x');
71
+ const result = await service.downloadAttachments({ issueKey: 'PROJ-1', filename: 'b.txt', downloadSide: DISABLED_DOWNLOAD });
72
+ expect(result.success).toBe(true);
73
+ expect(result.data.count).toBe(1);
74
+ expect(result.data.attachments[0].filename).toBe('b.txt');
75
+ expect(global.fetch).toHaveBeenCalledTimes(1);
76
+ });
77
+ it('fails when neither attachmentId nor issueKey is provided', async () => {
78
+ const result = await service.downloadAttachments({ downloadSide: DISABLED_DOWNLOAD });
79
+ expect(result.success).toBe(false);
80
+ expect(result.error).toContain('attachmentId or issueKey');
81
+ });
82
+ it('fails when an issue has no matching attachment', async () => {
83
+ IssueService.getIssue.mockResolvedValue({ fields: { attachment: [] } });
84
+ const result = await service.downloadAttachments({ issueKey: 'PROJ-1', filename: 'x.txt', downloadSide: DISABLED_DOWNLOAD });
85
+ expect(result.success).toBe(false);
86
+ expect(result.error).toContain('No attachment named "x.txt"');
87
+ });
88
+ });
89
+ //# sourceMappingURL=jira-download.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-download.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-download.test.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import os from 'node:os';
3
3
  import path from 'node:path';
4
4
  import { initializeRuntimeConfig } from '@atlassian-dc-mcp/common';
5
5
  import { JiraService } from '../jira-service.js';
6
- import { IssueService, OpenAPI, SearchService } from '../jira-client/index.js';
6
+ import { IssueLinkService, IssueLinkTypeService, IssueService, OpenAPI, SearchService } from '../jira-client/index.js';
7
7
  import { request as __request } from '../jira-client/core/request.js';
8
8
  jest.mock('../jira-client/core/request.js', () => ({
9
9
  request: jest.fn(),
@@ -21,6 +21,13 @@ jest.mock('../jira-client/index.js', () => ({
21
21
  SearchService: {
22
22
  searchUsingSearchRequest: jest.fn(),
23
23
  },
24
+ IssueLinkService: {
25
+ linkIssues: jest.fn(),
26
+ deleteIssueLink: jest.fn(),
27
+ },
28
+ IssueLinkTypeService: {
29
+ getIssueLinkTypes: jest.fn(),
30
+ },
24
31
  OpenAPI: {
25
32
  BASE: '',
26
33
  TOKEN: '',
@@ -343,5 +350,82 @@ describe('JiraService', () => {
343
350
  expect(missingVars).toEqual([]);
344
351
  });
345
352
  });
353
+ describe('getIssueLinkTypes', () => {
354
+ it('should return the available issue link types', async () => {
355
+ const mockLinkTypes = {
356
+ issueLinkTypes: [
357
+ { id: '10000', name: 'Blocks', inward: 'is blocked by', outward: 'blocks' },
358
+ { id: '10001', name: 'Relates', inward: 'relates to', outward: 'relates to' },
359
+ ],
360
+ };
361
+ IssueLinkTypeService.getIssueLinkTypes.mockResolvedValue(mockLinkTypes);
362
+ const result = await jiraService.getIssueLinkTypes();
363
+ expect(result.success).toBe(true);
364
+ expect(result.data).toBe(mockLinkTypes);
365
+ expect(IssueLinkTypeService.getIssueLinkTypes).toHaveBeenCalledWith();
366
+ });
367
+ it('should handle errors when issue linking is disabled', async () => {
368
+ IssueLinkTypeService.getIssueLinkTypes.mockRejectedValue(new Error('Issue linking is disabled'));
369
+ const result = await jiraService.getIssueLinkTypes();
370
+ expect(result.success).toBe(false);
371
+ expect(result.error).toBe('Issue linking is disabled');
372
+ });
373
+ });
374
+ describe('linkIssues', () => {
375
+ it('should create a link between two issues', async () => {
376
+ IssueLinkService.linkIssues.mockResolvedValue(undefined);
377
+ const result = await jiraService.linkIssues({
378
+ inwardIssueKey: 'PROJ-123',
379
+ outwardIssueKey: 'PROJ-456',
380
+ linkType: 'Blocks',
381
+ });
382
+ expect(result.success).toBe(true);
383
+ expect(IssueLinkService.linkIssues).toHaveBeenCalledWith({
384
+ type: { name: 'Blocks' },
385
+ inwardIssue: { key: 'PROJ-123' },
386
+ outwardIssue: { key: 'PROJ-456' },
387
+ });
388
+ });
389
+ it('should include an optional comment on the inward issue', async () => {
390
+ IssueLinkService.linkIssues.mockResolvedValue(undefined);
391
+ const result = await jiraService.linkIssues({
392
+ inwardIssueKey: 'PROJ-123',
393
+ outwardIssueKey: 'PROJ-456',
394
+ linkType: 'Relates',
395
+ comment: 'Linking these for tracking',
396
+ });
397
+ expect(result.success).toBe(true);
398
+ expect(IssueLinkService.linkIssues).toHaveBeenCalledWith({
399
+ type: { name: 'Relates' },
400
+ inwardIssue: { key: 'PROJ-123' },
401
+ outwardIssue: { key: 'PROJ-456' },
402
+ comment: { body: 'Linking these for tracking' },
403
+ });
404
+ });
405
+ it('should handle API errors gracefully', async () => {
406
+ IssueLinkService.linkIssues.mockRejectedValue(new Error('Issue link type not found'));
407
+ const result = await jiraService.linkIssues({
408
+ inwardIssueKey: 'PROJ-123',
409
+ outwardIssueKey: 'PROJ-456',
410
+ linkType: 'Nonexistent',
411
+ });
412
+ expect(result.success).toBe(false);
413
+ expect(result.error).toBe('Issue link type not found');
414
+ });
415
+ });
416
+ describe('unlinkIssues', () => {
417
+ it('should delete an issue link by id', async () => {
418
+ IssueLinkService.deleteIssueLink.mockResolvedValue(undefined);
419
+ const result = await jiraService.unlinkIssues('10500');
420
+ expect(result.success).toBe(true);
421
+ expect(IssueLinkService.deleteIssueLink).toHaveBeenCalledWith('10500');
422
+ });
423
+ it('should handle errors when the link id is invalid', async () => {
424
+ IssueLinkService.deleteIssueLink.mockRejectedValue(new Error('Invalid issue link id'));
425
+ const result = await jiraService.unlinkIssues('bad-id');
426
+ expect(result.success).toBe(false);
427
+ expect(result.error).toBe('Invalid issue link id');
428
+ });
429
+ });
346
430
  });
347
431
  //# sourceMappingURL=jira-service.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jira-service.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-service.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jira-service.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=jira-upload.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-upload.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jira-upload.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { JiraService } from '../jira-service.js';
5
+ import { IssueService } from '../jira-client/index.js';
6
+ jest.mock('../jira-client/index.js', () => ({
7
+ AttachmentService: {},
8
+ IssueService: {
9
+ addAttachment: jest.fn(),
10
+ },
11
+ MyselfService: {},
12
+ SearchService: {},
13
+ OpenAPI: { BASE: '', TOKEN: '', VERSION: '' },
14
+ }));
15
+ describe('JiraService.uploadAttachment', () => {
16
+ let service;
17
+ let root;
18
+ const uploadSide = () => ({ enabled: true, roots: [fs.realpathSync(root)], maxBytes: 1024 });
19
+ beforeEach(() => {
20
+ service = new JiraService('test-host', 'test-token', undefined, () => 25);
21
+ root = fs.mkdtempSync(path.join(os.tmpdir(), 'dc-mcp-jup-'));
22
+ jest.clearAllMocks();
23
+ IssueService.addAttachment.mockResolvedValue([{ id: '1', filename: 'a.txt' }]);
24
+ });
25
+ afterEach(() => {
26
+ fs.rmSync(root, { recursive: true, force: true });
27
+ jest.restoreAllMocks();
28
+ });
29
+ it('uploads a file resolved within the upload root', async () => {
30
+ fs.writeFileSync(path.join(root, 'a.txt'), 'hello');
31
+ const result = await service.uploadAttachment('PROJ-1', 'a.txt', uploadSide());
32
+ expect(result.success).toBe(true);
33
+ expect(IssueService.addAttachment).toHaveBeenCalledTimes(1);
34
+ const [issueKey, formData] = IssueService.addAttachment.mock.calls[0];
35
+ expect(issueKey).toBe('PROJ-1');
36
+ expect(formData.file.name).toBe('a.txt');
37
+ });
38
+ it('rejects an absolute path outside the root', async () => {
39
+ const result = await service.uploadAttachment('PROJ-1', '/etc/passwd', uploadSide());
40
+ expect(result.success).toBe(false);
41
+ expect(IssueService.addAttachment).not.toHaveBeenCalled();
42
+ });
43
+ it('rejects a symlink inside the root', async () => {
44
+ const target = path.join(root, 'real.txt');
45
+ fs.writeFileSync(target, 'secret');
46
+ fs.symlinkSync(target, path.join(root, 'link.txt'));
47
+ const result = await service.uploadAttachment('PROJ-1', 'link.txt', uploadSide());
48
+ expect(result.success).toBe(false);
49
+ expect(IssueService.addAttachment).not.toHaveBeenCalled();
50
+ });
51
+ it('rejects a file over the size limit', async () => {
52
+ fs.writeFileSync(path.join(root, 'big.txt'), 'x'.repeat(2048));
53
+ const result = await service.uploadAttachment('PROJ-1', 'big.txt', uploadSide());
54
+ expect(result.success).toBe(false);
55
+ expect(IssueService.addAttachment).not.toHaveBeenCalled();
56
+ });
57
+ });
58
+ //# sourceMappingURL=jira-upload.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-upload.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-upload.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1C,iBAAiB,EAAE,EAAE;IACrB,YAAY,EAAE;QACZ,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;KACzB;IACD,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;CAC9C,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,OAAoB,CAAC;IACzB,IAAI,IAAY,CAAC;IACjB,MAAM,UAAU,GAAG,GAA0B,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpH,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;QACpB,YAAY,CAAC,aAA2B,CAAC,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAE/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAI,YAAY,CAAC,aAA2B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACrF,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnC,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACjF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=response-body.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-body.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/response-body.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { getResponseBody } from '../jira-client/core/request.js';
2
+ function jsonResponse(status, body) {
3
+ return {
4
+ status,
5
+ headers: new Headers({ 'Content-Type': 'application/json' }),
6
+ text: async () => body,
7
+ json: async () => JSON.parse(body),
8
+ };
9
+ }
10
+ describe('getResponseBody', () => {
11
+ const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
12
+ afterEach(() => {
13
+ errorSpy.mockClear();
14
+ });
15
+ afterAll(() => {
16
+ errorSpy.mockRestore();
17
+ });
18
+ it('returns undefined for an empty JSON body without logging (e.g. POST /issueLink)', async () => {
19
+ const result = await getResponseBody(jsonResponse(201, ''));
20
+ expect(result).toBeUndefined();
21
+ expect(errorSpy).not.toHaveBeenCalled();
22
+ });
23
+ it('parses a non-empty JSON body', async () => {
24
+ const result = await getResponseBody(jsonResponse(200, '{"id":"1158012"}'));
25
+ expect(result).toEqual({ id: '1158012' });
26
+ expect(errorSpy).not.toHaveBeenCalled();
27
+ });
28
+ it('returns undefined for a 204 No Content response (e.g. DELETE /issueLink)', async () => {
29
+ const result = await getResponseBody(jsonResponse(204, ''));
30
+ expect(result).toBeUndefined();
31
+ expect(errorSpy).not.toHaveBeenCalled();
32
+ });
33
+ });
34
+ //# sourceMappingURL=response-body.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-body.test.js","sourceRoot":"","sources":["../../src/__tests__/response-body.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,SAAS,YAAY,CAAC,MAAc,EAAE,IAAY;IAChD,OAAO;QACL,MAAM;QACN,OAAO,EAAE,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC5D,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACtB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;KACZ,CAAC;AAC3B,CAAC;AAED,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAE3E,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,SAAS,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAE5E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/build/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { connectServer, createMcpServer, formatToolResponse, initializeRuntimeConfig } from '@atlassian-dc-mcp/common';
1
+ import { connectServer, createMcpServer, formatToolResponse, initializeRuntimeConfig, resolveAttachmentGateway } from '@atlassian-dc-mcp/common';
2
2
  import { JiraService, jiraToolSchemas } from './jira-service.js';
3
- import { getDefaultPageSize, getJiraRuntimeConfig } from './config.js';
3
+ import { getDefaultPageSize, getJiraRuntimeConfig, JIRA_PRODUCT } from './config.js';
4
4
  import { createRequire } from 'node:module';
5
5
  const require = createRequire(import.meta.url);
6
6
  const { version } = require('../package.json');
@@ -52,5 +52,41 @@ server.tool("jira_transitionIssue", `Transition a JIRA issue to a new status in
52
52
  const result = await jiraService.transitionIssue(params);
53
53
  return formatToolResponse(result);
54
54
  });
55
+ server.tool("jira_getIssueLinkTypes", `Get the list of available issue link types (e.g. Blocks, Relates, Duplicate) in the ${jiraInstanceType}. Use this to discover valid link type names before calling jira_linkIssues.`, jiraToolSchemas.getIssueLinkTypes, async () => {
56
+ const result = await jiraService.getIssueLinkTypes();
57
+ return formatToolResponse(result);
58
+ });
59
+ server.tool("jira_linkIssues", `Create a link between two JIRA issues in the ${jiraInstanceType}. Use jira_getIssueLinkTypes to find valid link type names.`, jiraToolSchemas.linkIssues, async (params) => {
60
+ const result = await jiraService.linkIssues(params);
61
+ return formatToolResponse(result);
62
+ });
63
+ server.tool("jira_unlinkIssues", `Delete an existing link between two JIRA issues in the ${jiraInstanceType}. Requires the issue link id (found in the 'issuelinks' field of an issue).`, jiraToolSchemas.unlinkIssues, async ({ linkId }) => {
64
+ const result = await jiraService.unlinkIssues(linkId);
65
+ return formatToolResponse(result);
66
+ });
67
+ const attachmentGateway = resolveAttachmentGateway(JIRA_PRODUCT);
68
+ // Filesystem-reading upload is only registered when the operator explicitly enables it.
69
+ if (attachmentGateway.upload.enabled) {
70
+ server.tool("jira_uploadAttachment", `Upload a local file as an attachment to a JIRA issue in the ${jiraInstanceType}. The file must live under the server-configured upload directory; the path is given relative to that directory.`, jiraToolSchemas.uploadAttachment, async ({ issueKey, sourcePath, filename }) => {
71
+ const result = await jiraService.uploadAttachment(issueKey, sourcePath, attachmentGateway.upload, filename);
72
+ return formatToolResponse(result);
73
+ });
74
+ }
75
+ // Download always returns content inline (no filesystem access). Saving to disk is
76
+ // only offered when the operator enables it, and is confined to the configured directory.
77
+ const downloadSaveEnabled = attachmentGateway.download.enabled;
78
+ server.tool("jira_downloadAttachment", `Download attachment(s) from a JIRA issue in the ${jiraInstanceType}, by issue key (optionally filtered by filename) or by a single attachment id. Returns the file content inline (base64 or text). Useful for inspecting a file or moving it elsewhere (e.g. re-uploading to a Confluence page).${downloadSaveEnabled ? ' Can also save into the server-configured download directory; existing files are never overwritten.' : ' Saving to local disk is disabled on this server.'}`, { ...jiraToolSchemas.downloadAttachment, ...(downloadSaveEnabled ? jiraToolSchemas.downloadAttachmentSaveFields : {}) }, async ({ issueKey, attachmentId, filename, returnContent, maxInlineBytes, save, saveName }) => {
79
+ const result = await jiraService.downloadAttachments({
80
+ issueKey,
81
+ attachmentId,
82
+ filename,
83
+ save,
84
+ saveName,
85
+ returnContent,
86
+ maxInlineBytes,
87
+ downloadSide: attachmentGateway.download,
88
+ });
89
+ return formatToolResponse(result);
90
+ });
55
91
  await connectServer(server);
56
92
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}