@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 +21 -0
- package/README.md +53 -0
- package/build/__tests__/jira-download.test.d.ts +2 -0
- package/build/__tests__/jira-download.test.d.ts.map +1 -0
- package/build/__tests__/jira-download.test.js +89 -0
- package/build/__tests__/jira-download.test.js.map +1 -0
- package/build/__tests__/jira-upload.test.d.ts +2 -0
- package/build/__tests__/jira-upload.test.d.ts.map +1 -0
- package/build/__tests__/jira-upload.test.js +58 -0
- package/build/__tests__/jira-upload.test.js.map +1 -0
- package/build/index.js +26 -2
- package/build/index.js.map +1 -1
- package/build/jira-service.d.ts +45 -0
- package/build/jira-service.d.ts.map +1 -1
- package/build/jira-service.js +100 -2
- package/build/jira-service.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/jira-download.test.ts +111 -0
- package/src/__tests__/jira-upload.test.ts +70 -0
- package/src/index.ts +47 -2
- package/src/jira-service.ts +130 -2
- package/tsconfig.tsbuildinfo +1 -1
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 @@
|
|
|
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 @@
|
|
|
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
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/jira-service.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"jira-service.d.ts","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAML,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AASlC,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;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;gBAGlE,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;IAe1C,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,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,qBAAqB,EAAE,QAAQ,CAAC,EAAE,MAAM;IAWjH;;;;;;;;;;;OAWG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAChC,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,yBAAyB,CAAC;QAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,qBAAqB,CAAC;KACrC;;;;YAyCa,sBAAsB;IAyB9B,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6E3B,CAAC"}
|
package/build/jira-service.js
CHANGED
|
@@ -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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"}
|