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 CHANGED
@@ -1,7 +1,9 @@
1
+ <!-- mcp-name: io.github.freema/mcp-jira-stdio -->
2
+
1
3
  # MCP Jira Server
2
4
 
3
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.0%2B-007ACC?logo=typescript&logoColor=white)](https://www.typescriptlang.org)
4
- [![Node](https://img.shields.io/badge/Node.js-18%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org)
6
+ [![Node](https://img.shields.io/badge/Node.js-20%2B-339933?logo=node.js&logoColor=white)](https://nodejs.org)
5
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
8
  [![npm version](https://badge.fury.io/js/mcp-jira-stdio.svg)](https://www.npmjs.com/package/mcp-jira-stdio)
7
9
  [![MCP Server](https://img.shields.io/badge/MCP-Server-blue)](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 v18 or higher
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.10.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: "^3.22.4"
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": "^9.1.0",
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.errors.map((err) => `${err.path.join(".")}: ${err.message}`);
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"] || "application/octet-stream"
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
  }