mcp-jira-stdio 1.10.1 → 1.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.js +20 -6
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
<!-- mcp-name: io.github.freema/mcp-jira-stdio -->
|
|
2
|
+
|
|
1
3
|
# MCP Jira Server
|
|
2
4
|
|
|
3
5
|
[](https://www.typescriptlang.org)
|
|
4
|
-
[](https://nodejs.org)
|
|
5
7
|
[](https://opensource.org/licenses/MIT)
|
|
6
8
|
[](https://www.npmjs.com/package/mcp-jira-stdio)
|
|
7
9
|
[](https://glama.ai/mcp/servers)
|
|
@@ -42,7 +44,7 @@ If you prefer to configure manually or use Claude Desktop, see the [Configuratio
|
|
|
42
44
|
|
|
43
45
|
### 1. Prerequisites
|
|
44
46
|
|
|
45
|
-
- Node.js
|
|
47
|
+
- Node.js v20 or higher
|
|
46
48
|
- Jira instance (Cloud or Server)
|
|
47
49
|
- Jira API token
|
|
48
50
|
|
package/dist/index.js
CHANGED
|
@@ -440,7 +440,8 @@ var require_package2 = __commonJS({
|
|
|
440
440
|
"package.json"(exports$1, module) {
|
|
441
441
|
module.exports = {
|
|
442
442
|
name: "mcp-jira-stdio",
|
|
443
|
-
version: "1.
|
|
443
|
+
version: "1.11.0",
|
|
444
|
+
mcpName: "io.github.freema/mcp-jira-stdio",
|
|
444
445
|
description: "Model Context Protocol (MCP) server for Jira API integration",
|
|
445
446
|
author: "graslt",
|
|
446
447
|
license: "MIT",
|
|
@@ -493,7 +494,7 @@ var require_package2 = __commonJS({
|
|
|
493
494
|
axios: "^1.7.0",
|
|
494
495
|
"form-data": "^4.0.5",
|
|
495
496
|
"md-to-adf": "^0.5.0",
|
|
496
|
-
zod: "^
|
|
497
|
+
zod: "^4.4.2"
|
|
497
498
|
},
|
|
498
499
|
devDependencies: {
|
|
499
500
|
"@types/node": "^25.3.3",
|
|
@@ -503,7 +504,7 @@ var require_package2 = __commonJS({
|
|
|
503
504
|
"@vitest/ui": "^4.0.10",
|
|
504
505
|
dotenv: "^17.2.1",
|
|
505
506
|
eslint: "^9.9.0",
|
|
506
|
-
"eslint-config-prettier": "^
|
|
507
|
+
"eslint-config-prettier": "^10.1.8",
|
|
507
508
|
"eslint-plugin-prettier": "^5.2.0",
|
|
508
509
|
prettier: "^3.5.0",
|
|
509
510
|
tsup: "^8.5.1",
|
|
@@ -817,7 +818,7 @@ function validateInput(schema, input) {
|
|
|
817
818
|
return schema.parse(input);
|
|
818
819
|
} catch (error) {
|
|
819
820
|
if (error instanceof z.ZodError) {
|
|
820
|
-
const errorMessages = error.
|
|
821
|
+
const errorMessages = error.issues.map((err) => `${err.path.join(".")}: ${err.message}`);
|
|
821
822
|
throw new Error(`${ERROR_MESSAGES.VALIDATION_ERROR}
|
|
822
823
|
${errorMessages.join("\n")}`);
|
|
823
824
|
}
|
|
@@ -869,7 +870,7 @@ var CreateIssueInputSchema = z.object({
|
|
|
869
870
|
assignee: z.string().optional().describe("Assignee account ID"),
|
|
870
871
|
labels: z.array(z.string()).optional().describe("Issue labels"),
|
|
871
872
|
components: z.array(z.string()).optional().describe("Component names"),
|
|
872
|
-
customFields: z.record(z.any()).optional().describe(
|
|
873
|
+
customFields: z.record(z.string(), z.any()).optional().describe(
|
|
873
874
|
'Additional Jira field mappings, e.g. { "customfield_12345": value }. Use for required custom fields.'
|
|
874
875
|
),
|
|
875
876
|
returnIssue: z.boolean().optional().describe("When false, skip fetching full issue after creation"),
|
|
@@ -1034,6 +1035,19 @@ function ensureAdfDescription(desc, format = "markdown") {
|
|
|
1034
1035
|
}
|
|
1035
1036
|
}
|
|
1036
1037
|
if (format === "adf") {
|
|
1038
|
+
if (typeof desc === "string") {
|
|
1039
|
+
const trimmed = desc.trim();
|
|
1040
|
+
try {
|
|
1041
|
+
const parsed = JSON.parse(trimmed);
|
|
1042
|
+
if (parsed && typeof parsed === "object" && parsed.type === "doc") {
|
|
1043
|
+
return parsed;
|
|
1044
|
+
}
|
|
1045
|
+
} catch {
|
|
1046
|
+
}
|
|
1047
|
+
throw new Error(
|
|
1048
|
+
'ADF format: body must be a JSON string that parses to an ADF document with type "doc" (stringified Atlassian Document Format).'
|
|
1049
|
+
);
|
|
1050
|
+
}
|
|
1037
1051
|
return desc;
|
|
1038
1052
|
}
|
|
1039
1053
|
const urlRegex = /https?:\/\/[^\s)]+/g;
|
|
@@ -1544,7 +1558,7 @@ async function addAttachmentFromUrl(issueKey, fileUrl, filename) {
|
|
|
1544
1558
|
const formData = new FormData();
|
|
1545
1559
|
formData.append("file", fileBuffer, {
|
|
1546
1560
|
filename,
|
|
1547
|
-
contentType: response.headers["content-type"]
|
|
1561
|
+
contentType: typeof response.headers["content-type"] === "string" ? response.headers["content-type"] : "application/octet-stream"
|
|
1548
1562
|
});
|
|
1549
1563
|
return await makeMultipartRequest(`/issue/${issueKey}/attachments`, formData);
|
|
1550
1564
|
}
|