@atlassian-dc-mcp/jira 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,27 @@
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.29.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.28.0...v0.29.0) (2026-07-26)
7
+
8
+ **Note:** Version bump only for package @atlassian-dc-mcp/jira
9
+
10
+
11
+
12
+
13
+
14
+ # [0.28.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.27.0...v0.28.0) (2026-07-22)
15
+
16
+
17
+ ### Features
18
+
19
+ * add jira_uploadAttachment tool ([e19180f](https://github.com/b1ff/atlassian-dc-mcp/commit/e19180f9210c831f4827aa331a189fa4d3a72de7))
20
+ * **attachments:** sandbox local filesystem access behind an opt-in gateway ([2a22547](https://github.com/b1ff/atlassian-dc-mcp/commit/2a22547292a390a032642ad09bd09ede0808e9d7))
21
+ * **jira:** add jira_downloadAttachment tool ([31cbeef](https://github.com/b1ff/atlassian-dc-mcp/commit/31cbeefd00fde37b1245efbe975ea4d63db46758))
22
+
23
+
24
+
25
+
26
+
6
27
  # [0.27.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.26.0...v0.27.0) (2026-07-18)
7
28
 
8
29
 
package/README.md CHANGED
@@ -138,6 +138,37 @@ Alternatively, you can use `JIRA_API_BASE_PATH` instead of `JIRA_HOST` to specif
138
138
 
139
139
  See [Configuration sources](#configuration-sources) for the full precedence chain.
140
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
+
141
172
  To create a personal access token:
142
173
  - In Jira, select your profile picture at the top right
143
174
  - Select **Personal Access Tokens**
@@ -271,3 +302,25 @@ Delete an existing link between two JIRA issues in the JIRA Data Center edition
271
302
 
272
303
  Parameters:
273
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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"}
@@ -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":"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"}
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');
@@ -64,5 +64,29 @@ server.tool("jira_unlinkIssues", `Delete an existing link between two JIRA issue
64
64
  const result = await jiraService.unlinkIssues(linkId);
65
65
  return formatToolResponse(result);
66
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
+ });
67
91
  await connectServer(server);
68
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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"}
@@ -1,8 +1,10 @@
1
1
  import { z } from 'zod';
2
+ import { type AttachmentContentEncoding, type AttachmentGatewaySide } from '@atlassian-dc-mcp/common';
2
3
  type DevelopmentDataType = 'pullrequest' | 'repository' | 'branch';
3
4
  type DevelopmentApplicationType = 'stash' | 'bitbucket' | 'github' | 'githube';
4
5
  export declare class JiraService {
5
6
  private readonly getPageSize;
7
+ private readonly tokenProvider;
6
8
  constructor(host: string | undefined, token: string | (() => string | undefined), apiBasePath?: string, getPageSize?: () => number);
7
9
  searchIssues(jql: string, startAt?: number, expand?: string[], maxResults?: number, fields?: string[]): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<import("./jira-client/index.js").SearchResultsBean>>;
8
10
  getIssue(issueKey: string, expand?: string, fields?: string[]): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<import("./jira-client/index.js").IssueBean>>;
@@ -31,6 +33,33 @@ export declare class JiraService {
31
33
  fields?: Record<string, any>;
32
34
  customFields?: Record<string, any>;
33
35
  }): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<void>>;
36
+ uploadAttachment(issueKey: string, sourcePath: string, uploadSide: AttachmentGatewaySide, filename?: string): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<import("./jira-client/index.js").AttachmentJsonBean>>;
37
+ /**
38
+ * Download attachments from a JIRA issue, or a single attachment by its id.
39
+ * Exactly one of `attachmentId` or `issueKey` must be provided.
40
+ * @param params.attachmentId Download a single attachment by its numeric id
41
+ * @param params.issueKey Download attachments from this issue (optionally filtered by filename)
42
+ * @param params.filename When using issueKey, download only attachments with this exact filename
43
+ * @param params.save Whether to write the attachment(s) to the operator-configured download directory
44
+ * @param params.saveName Optional file name (basename only) when saving a single attachment
45
+ * @param params.returnContent Whether/how to embed the bytes inline in the response
46
+ * @param params.maxInlineBytes Inline embedding cap
47
+ * @param params.downloadSide Resolved download gateway (roots, size limit, enabled flag)
48
+ */
49
+ downloadAttachments(params: {
50
+ attachmentId?: string;
51
+ issueKey?: string;
52
+ filename?: string;
53
+ save?: boolean;
54
+ saveName?: string;
55
+ returnContent?: AttachmentContentEncoding;
56
+ maxInlineBytes?: number;
57
+ downloadSide: AttachmentGatewaySide;
58
+ }): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<{
59
+ count: number;
60
+ attachments: import("@atlassian-dc-mcp/common").AttachmentDownloadResult[];
61
+ }>>;
62
+ private resolveAttachmentBeans;
34
63
  getIssueLinkTypes(): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<import("./jira-client/index.js").IssueLinkTypesBean>>;
35
64
  linkIssues(params: {
36
65
  inwardIssueKey: string;
@@ -93,6 +122,22 @@ export declare const jiraToolSchemas: {
93
122
  fields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
94
123
  customFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
95
124
  };
125
+ uploadAttachment: {
126
+ issueKey: z.ZodString;
127
+ sourcePath: z.ZodString;
128
+ filename: z.ZodOptional<z.ZodString>;
129
+ };
130
+ downloadAttachment: {
131
+ issueKey: z.ZodOptional<z.ZodString>;
132
+ attachmentId: z.ZodOptional<z.ZodString>;
133
+ filename: z.ZodOptional<z.ZodString>;
134
+ returnContent: z.ZodOptional<z.ZodEnum<["none", "base64", "text"]>>;
135
+ maxInlineBytes: z.ZodOptional<z.ZodNumber>;
136
+ };
137
+ downloadAttachmentSaveFields: {
138
+ save: z.ZodOptional<z.ZodBoolean>;
139
+ saveName: z.ZodOptional<z.ZodString>;
140
+ };
96
141
  getIssueLinkTypes: {};
97
142
  linkIssues: {
98
143
  inwardIssueKey: z.ZodString;
@@ -1 +1 @@
1
- {"version":3,"file":"jira-service.d.ts","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,KAAK,mBAAmB,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,CAAC;AACnE,KAAK,0BAA0B,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAiB/E,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;gBAGzC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,EAC1C,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,GAAE,MAAM,MAA2B;IAa1C,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE;IAYrG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE;IAO7D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAOzF,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIlD,WAAW,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAiBK,WAAW,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAqBK,cAAc,CAAC,QAAQ,EAAE,MAAM;IAO/B,uBAAuB,CAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,mBAAmC,EAC7C,eAAe,GAAE,0BAAoC;YAYzC,cAAc;IAStB,eAAe,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAeK,iBAAiB;IAOjB,UAAU,CAAC,MAAM,EAAE;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,eAAe,EAAE,MAAM,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;IAWK,YAAY,CAAC,MAAM,EAAE,MAAM;IAO3B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,cAAc,IAAI,MAAM,EAAE;CAGlC;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D3B,CAAC"}
1
+ {"version":3,"file":"jira-service.d.ts","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,9 @@
1
+ import { File } from 'node:buffer';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { basename } from 'node:path';
1
4
  import { z } from 'zod';
2
- import { handleApiOperation, resolveOpenApiBase } from '@atlassian-dc-mcp/common';
3
- import { IssueLinkService, IssueLinkTypeService, IssueService, MyselfService, OpenAPI, SearchService } from './jira-client/index.js';
5
+ import { downloadAttachment, handleApiOperation, resolveDownloadDestination, resolveOpenApiBase, resolveUploadSource, } from '@atlassian-dc-mcp/common';
6
+ import { AttachmentService, IssueLinkService, IssueLinkTypeService, IssueService, MyselfService, OpenAPI, SearchService } from './jira-client/index.js';
4
7
  import { request as __request } from './jira-client/core/request.js';
5
8
  import { getDefaultPageSize, getMissingConfig, JIRA_PRODUCT } from './config.js';
6
9
  const DEFAULT_SEARCH_FIELDS = ['summary', 'description', 'status', 'assignee', 'reporter', 'priority', 'issuetype', 'labels', 'updated'];
@@ -20,6 +23,7 @@ function resolveToken(token, missingTokenMessage) {
20
23
  }
21
24
  export class JiraService {
22
25
  getPageSize;
26
+ tokenProvider;
23
27
  constructor(host, token, apiBasePath, getPageSize = getDefaultPageSize) {
24
28
  OpenAPI.BASE = resolveOpenApiBase({
25
29
  host,
@@ -29,6 +33,8 @@ export class JiraService {
29
33
  });
30
34
  OpenAPI.TOKEN = resolveToken(token, 'Missing required environment variable: JIRA_API_TOKEN');
31
35
  OpenAPI.VERSION = '2';
36
+ OpenAPI.HEADERS = { 'X-Atlassian-Token': 'no-check' };
37
+ this.tokenProvider = token;
32
38
  this.getPageSize = getPageSize;
33
39
  }
34
40
  async searchIssues(jql, startAt, expand, maxResults, fields) {
@@ -118,6 +124,82 @@ export class JiraService {
118
124
  return IssueService.doTransition(params.issueKey, requestBody);
119
125
  }, 'Error transitioning issue');
120
126
  }
127
+ async uploadAttachment(issueKey, sourcePath, uploadSide, filename) {
128
+ return handleApiOperation(async () => {
129
+ const { absolutePath } = await resolveUploadSource({ requestedPath: sourcePath, side: uploadSide });
130
+ const buffer = await readFile(absolutePath);
131
+ const name = filename || basename(absolutePath);
132
+ const file = new File([buffer], name);
133
+ // IssueService types formData as Blob, but the API expects { file } — getFormData handles File via isBlob()
134
+ return IssueService.addAttachment(issueKey, { file });
135
+ }, 'Error uploading attachment');
136
+ }
137
+ /**
138
+ * Download attachments from a JIRA issue, or a single attachment by its id.
139
+ * Exactly one of `attachmentId` or `issueKey` must be provided.
140
+ * @param params.attachmentId Download a single attachment by its numeric id
141
+ * @param params.issueKey Download attachments from this issue (optionally filtered by filename)
142
+ * @param params.filename When using issueKey, download only attachments with this exact filename
143
+ * @param params.save Whether to write the attachment(s) to the operator-configured download directory
144
+ * @param params.saveName Optional file name (basename only) when saving a single attachment
145
+ * @param params.returnContent Whether/how to embed the bytes inline in the response
146
+ * @param params.maxInlineBytes Inline embedding cap
147
+ * @param params.downloadSide Resolved download gateway (roots, size limit, enabled flag)
148
+ */
149
+ async downloadAttachments(params) {
150
+ return handleApiOperation(async () => {
151
+ if (params.save && !params.downloadSide.enabled) {
152
+ throw new Error('Saving attachments to disk is disabled on this server. Enable it with ' +
153
+ 'JIRA_ATTACHMENTS_DOWNLOAD_ENABLED and configure a download directory.');
154
+ }
155
+ const beans = await this.resolveAttachmentBeans(params);
156
+ const multiple = beans.length > 1;
157
+ const attachments = [];
158
+ for (const bean of beans) {
159
+ const url = bean?.content;
160
+ if (!url) {
161
+ throw new Error(`Attachment "${bean?.filename ?? bean?.id}" has no download URL`);
162
+ }
163
+ const filename = bean?.filename ?? String(bean?.id ?? 'attachment');
164
+ let destination;
165
+ if (params.save) {
166
+ const requestedName = multiple ? filename : params.saveName ?? filename;
167
+ destination = await resolveDownloadDestination({ requestedName, side: params.downloadSide });
168
+ }
169
+ attachments.push(await downloadAttachment({
170
+ url,
171
+ token: this.tokenProvider,
172
+ filename,
173
+ mediaType: bean?.mimeType,
174
+ options: {
175
+ destination,
176
+ returnContent: params.returnContent,
177
+ maxInlineBytes: params.maxInlineBytes,
178
+ maxDownloadBytes: params.downloadSide.maxBytes,
179
+ },
180
+ }));
181
+ }
182
+ return { count: attachments.length, attachments };
183
+ }, 'Error downloading attachment');
184
+ }
185
+ async resolveAttachmentBeans(params) {
186
+ if (params.attachmentId) {
187
+ const bean = await AttachmentService.getAttachment(params.attachmentId);
188
+ return [bean];
189
+ }
190
+ if (!params.issueKey) {
191
+ throw new Error('Either attachmentId or issueKey must be provided');
192
+ }
193
+ const issue = await IssueService.getIssue(params.issueKey, undefined, toIssueFieldSelection(['attachment']));
194
+ const all = ((issue?.fields?.attachment) ?? []);
195
+ const filtered = params.filename ? all.filter((a) => a?.filename === params.filename) : all;
196
+ if (filtered.length === 0) {
197
+ throw new Error(params.filename
198
+ ? `No attachment named "${params.filename}" found on issue ${params.issueKey}`
199
+ : `No attachments found on issue ${params.issueKey}`);
200
+ }
201
+ return filtered;
202
+ }
121
203
  async getIssueLinkTypes() {
122
204
  return handleApiOperation(() => IssueLinkTypeService.getIssueLinkTypes(), 'Error getting issue link types');
123
205
  }
@@ -192,6 +274,22 @@ export const jiraToolSchemas = {
192
274
  fields: z.record(z.any()).optional().describe("Optional fields required by the transition screen. Use jira_getTransitions to see which fields are available for each transition."),
193
275
  customFields: z.record(z.any()).optional().describe("Optional fields merged into the JIRA transition payload. Can be used for update operations such as comments. Example: {'update': {'comment': [{'add': {'body': 'text'}}]}}")
194
276
  },
277
+ uploadAttachment: {
278
+ issueKey: z.string().describe("JIRA issue key (e.g., PROJ-123)"),
279
+ sourcePath: z.string().describe("Path to the file to upload, relative to a server-configured attachment upload directory. Absolute paths and '..' segments are rejected; symlinks and non-regular files are refused."),
280
+ filename: z.string().optional().describe("Override for the attachment filename (defaults to the basename of sourcePath)")
281
+ },
282
+ downloadAttachment: {
283
+ issueKey: z.string().optional().describe("JIRA issue key (e.g., PROJ-123) whose attachment(s) to download. Provide either issueKey or attachmentId."),
284
+ attachmentId: z.string().optional().describe("Numeric id of a single attachment to download. Provide either attachmentId or issueKey."),
285
+ filename: z.string().optional().describe("When using issueKey, download only attachments with this exact filename. If omitted, all attachments on the issue are downloaded."),
286
+ returnContent: z.enum(['none', 'base64', 'text']).optional().describe("Whether to embed the file bytes in the response: 'none' (default), 'base64' for binary, or 'text' for UTF-8 text."),
287
+ maxInlineBytes: z.number().optional().describe("Maximum bytes to embed inline when returnContent is base64/text. Larger files are omitted from the inline content. Defaults to 1 MiB.")
288
+ },
289
+ downloadAttachmentSaveFields: {
290
+ save: z.boolean().optional().describe("Save the attachment(s) into the server-configured download directory. Requires disk downloads to be enabled on the server."),
291
+ saveName: z.string().optional().describe("Optional file name (no directories) to use when saving a single attachment; defaults to the attachment's own name. Existing files are never overwritten.")
292
+ },
195
293
  getIssueLinkTypes: {},
196
294
  linkIssues: {
197
295
  inwardIssueKey: z.string().describe("Key of the inward issue (the one the inward link description applies to, e.g. the issue that 'is blocked by'). Example: PROJ-123"),
@@ -1 +1 @@
1
- {"version":3,"file":"jira-service.js","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"jira-service.js","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"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"}