@crypto512/jicon-mcp 0.6.1 → 0.7.1

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 (77) hide show
  1. package/README.md +265 -43
  2. package/TOOL_LIST.md +201 -5
  3. package/dist/config/types.d.ts +6 -6
  4. package/dist/config/types.d.ts.map +1 -1
  5. package/dist/config/types.js +3 -2
  6. package/dist/config/types.js.map +1 -1
  7. package/dist/confluence/client.d.ts +8 -16
  8. package/dist/confluence/client.d.ts.map +1 -1
  9. package/dist/confluence/client.js +75 -43
  10. package/dist/confluence/client.js.map +1 -1
  11. package/dist/confluence/formatters.d.ts +4 -0
  12. package/dist/confluence/formatters.d.ts.map +1 -1
  13. package/dist/confluence/formatters.js +19 -0
  14. package/dist/confluence/formatters.js.map +1 -1
  15. package/dist/confluence/tools.d.ts +9 -36
  16. package/dist/confluence/tools.d.ts.map +1 -1
  17. package/dist/confluence/tools.js +90 -158
  18. package/dist/confluence/tools.js.map +1 -1
  19. package/dist/index.js +9 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/jira/client.d.ts +9 -9
  22. package/dist/jira/client.d.ts.map +1 -1
  23. package/dist/jira/client.js +252 -30
  24. package/dist/jira/client.js.map +1 -1
  25. package/dist/jira/formatters.d.ts +4 -0
  26. package/dist/jira/formatters.d.ts.map +1 -1
  27. package/dist/jira/formatters.js +24 -0
  28. package/dist/jira/formatters.js.map +1 -1
  29. package/dist/jira/tools.d.ts +36 -36
  30. package/dist/jira/tools.d.ts.map +1 -1
  31. package/dist/jira/tools.js +161 -139
  32. package/dist/jira/tools.js.map +1 -1
  33. package/dist/jira/types.d.ts +50 -0
  34. package/dist/jira/types.d.ts.map +1 -1
  35. package/dist/permissions/filter.d.ts.map +1 -1
  36. package/dist/permissions/filter.js +42 -13
  37. package/dist/permissions/filter.js.map +1 -1
  38. package/dist/permissions/tool-registry.d.ts +33 -14
  39. package/dist/permissions/tool-registry.d.ts.map +1 -1
  40. package/dist/permissions/tool-registry.js +80 -5
  41. package/dist/permissions/tool-registry.js.map +1 -1
  42. package/dist/tempo/client.d.ts +1 -0
  43. package/dist/tempo/client.d.ts.map +1 -1
  44. package/dist/tempo/client.js +43 -0
  45. package/dist/tempo/client.js.map +1 -1
  46. package/dist/tempo/formatters.d.ts +4 -0
  47. package/dist/tempo/formatters.d.ts.map +1 -1
  48. package/dist/tempo/formatters.js +24 -0
  49. package/dist/tempo/formatters.js.map +1 -1
  50. package/dist/tempo/tools.d.ts +21 -0
  51. package/dist/tempo/tools.d.ts.map +1 -1
  52. package/dist/tempo/tools.js +74 -134
  53. package/dist/tempo/tools.js.map +1 -1
  54. package/dist/types.d.ts +1 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/types.js.map +1 -1
  57. package/dist/utils/buffer-tools.d.ts +128 -0
  58. package/dist/utils/buffer-tools.d.ts.map +1 -0
  59. package/dist/utils/buffer-tools.js +312 -0
  60. package/dist/utils/buffer-tools.js.map +1 -0
  61. package/dist/utils/content-buffer.d.ts +144 -0
  62. package/dist/utils/content-buffer.d.ts.map +1 -0
  63. package/dist/utils/content-buffer.js +330 -0
  64. package/dist/utils/content-buffer.js.map +1 -0
  65. package/dist/utils/response-formatter.d.ts +5 -1
  66. package/dist/utils/response-formatter.d.ts.map +1 -1
  67. package/dist/utils/response-formatter.js +52 -2
  68. package/dist/utils/response-formatter.js.map +1 -1
  69. package/dist/utils/workload-tools.d.ts +68 -0
  70. package/dist/utils/workload-tools.d.ts.map +1 -0
  71. package/dist/utils/workload-tools.js +134 -0
  72. package/dist/utils/workload-tools.js.map +1 -0
  73. package/package.json +1 -1
  74. package/CLAUDE.md +0 -722
  75. package/CONTRIBUTING.md +0 -371
  76. package/DEVELOPMENT.md +0 -400
  77. package/JIRA_API_ANALYSIS.md +0 -275
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Content Buffer for MCP Server
3
+ *
4
+ * Provides in-memory buffering with pagination support for large content
5
+ * that needs to be returned in chunks to MCP clients.
6
+ */
7
+ import { randomBytes } from "crypto";
8
+ export class ContentBuffer {
9
+ buffers;
10
+ defaultTTL;
11
+ modifiedTTL;
12
+ cleanupInterval = null;
13
+ defaultChunkSize;
14
+ constructor(options) {
15
+ this.buffers = new Map();
16
+ this.defaultTTL = options?.defaultTTL ?? 10 * 60 * 1000; // 10 minutes
17
+ this.modifiedTTL = options?.modifiedTTL ?? 24 * 60 * 60 * 1000; // 1 day for modified buffers
18
+ this.defaultChunkSize = options?.defaultChunkSize ?? 5000;
19
+ // Start periodic cleanup
20
+ const cleanupMs = options?.cleanupIntervalMs ?? 60 * 1000; // 1 minute
21
+ this.cleanupInterval = setInterval(() => this.cleanup(), cleanupMs);
22
+ // Ensure cleanup interval doesn't prevent process exit
23
+ if (this.cleanupInterval.unref) {
24
+ this.cleanupInterval.unref();
25
+ }
26
+ }
27
+ /**
28
+ * Check if a buffer entry is expired
29
+ * Modified buffers use modifiedAt as the reference time
30
+ */
31
+ isExpired(entry) {
32
+ const referenceTime = entry.modifiedAt ?? entry.createdAt;
33
+ return Date.now() - referenceTime > entry.ttl;
34
+ }
35
+ /**
36
+ * Get the expiration timestamp for a buffer entry
37
+ */
38
+ getExpiresAt(entry) {
39
+ const referenceTime = entry.modifiedAt ?? entry.createdAt;
40
+ return referenceTime + entry.ttl;
41
+ }
42
+ /**
43
+ * Store content in the buffer and return a unique buffer ID
44
+ */
45
+ store(content, metadata, ttl) {
46
+ const bufferId = this.generateId();
47
+ const entry = {
48
+ content,
49
+ totalSize: content.length,
50
+ createdAt: Date.now(),
51
+ ttl: ttl ?? this.defaultTTL,
52
+ metadata,
53
+ };
54
+ this.buffers.set(bufferId, entry);
55
+ return bufferId;
56
+ }
57
+ /**
58
+ * Get a chunk of content from the buffer
59
+ */
60
+ getChunk(bufferId, offset = 0, limit = this.defaultChunkSize) {
61
+ const entry = this.buffers.get(bufferId);
62
+ if (!entry) {
63
+ return null;
64
+ }
65
+ // Check if expired
66
+ if (this.isExpired(entry)) {
67
+ this.buffers.delete(bufferId);
68
+ return null;
69
+ }
70
+ const chunk = entry.content.slice(offset, offset + limit);
71
+ const endOffset = offset + chunk.length;
72
+ const hasMore = endOffset < entry.totalSize;
73
+ return {
74
+ bufferId,
75
+ chunk,
76
+ offset,
77
+ limit,
78
+ totalSize: entry.totalSize,
79
+ hasMore,
80
+ metadata: entry.metadata,
81
+ };
82
+ }
83
+ /**
84
+ * Check if a buffer exists and is valid
85
+ */
86
+ has(bufferId) {
87
+ const entry = this.buffers.get(bufferId);
88
+ if (!entry) {
89
+ return false;
90
+ }
91
+ if (this.isExpired(entry)) {
92
+ this.buffers.delete(bufferId);
93
+ return false;
94
+ }
95
+ return true;
96
+ }
97
+ /**
98
+ * Get buffer info without content
99
+ */
100
+ getInfo(bufferId) {
101
+ const entry = this.buffers.get(bufferId);
102
+ if (!entry) {
103
+ return null;
104
+ }
105
+ if (this.isExpired(entry)) {
106
+ this.buffers.delete(bufferId);
107
+ return null;
108
+ }
109
+ return {
110
+ bufferId,
111
+ totalSize: entry.totalSize,
112
+ createdAt: entry.createdAt,
113
+ expiresAt: this.getExpiresAt(entry),
114
+ metadata: entry.metadata,
115
+ };
116
+ }
117
+ /**
118
+ * List all active buffers
119
+ */
120
+ list() {
121
+ const result = [];
122
+ for (const [bufferId, entry] of this.buffers.entries()) {
123
+ if (this.isExpired(entry)) {
124
+ this.buffers.delete(bufferId);
125
+ continue;
126
+ }
127
+ result.push({
128
+ bufferId,
129
+ totalSize: entry.totalSize,
130
+ createdAt: entry.createdAt,
131
+ expiresAt: this.getExpiresAt(entry),
132
+ metadata: entry.metadata,
133
+ });
134
+ }
135
+ return result;
136
+ }
137
+ /**
138
+ * Clear a specific buffer or all buffers
139
+ */
140
+ clear(bufferId) {
141
+ if (bufferId) {
142
+ return this.buffers.delete(bufferId);
143
+ }
144
+ this.buffers.clear();
145
+ return true;
146
+ }
147
+ /**
148
+ * Get the number of active buffers
149
+ */
150
+ size() {
151
+ return this.buffers.size;
152
+ }
153
+ /**
154
+ * Search buffer content for a pattern with context lines
155
+ */
156
+ grep(bufferId, pattern, options = {}) {
157
+ const entry = this.buffers.get(bufferId);
158
+ if (!entry) {
159
+ return null;
160
+ }
161
+ // Check if expired
162
+ if (this.isExpired(entry)) {
163
+ this.buffers.delete(bufferId);
164
+ return null;
165
+ }
166
+ const { caseInsensitive = false, before = 0, after = 0, multiline = false, countOnly = false, headLimit, offset = 0, } = options;
167
+ // Build regex flags
168
+ let flags = "g";
169
+ if (caseInsensitive)
170
+ flags += "i";
171
+ if (multiline)
172
+ flags += "ms";
173
+ let regex;
174
+ try {
175
+ regex = new RegExp(pattern, flags);
176
+ }
177
+ catch {
178
+ return null; // Invalid regex
179
+ }
180
+ const content = entry.content;
181
+ const lines = content.split("\n");
182
+ // Find all matching line indices
183
+ const matchingLineIndices = [];
184
+ for (let i = 0; i < lines.length; i++) {
185
+ if (regex.test(lines[i])) {
186
+ matchingLineIndices.push(i);
187
+ }
188
+ // Reset regex lastIndex for global flag
189
+ regex.lastIndex = 0;
190
+ }
191
+ // Count only mode
192
+ if (countOnly) {
193
+ return {
194
+ bufferId,
195
+ pattern,
196
+ count: matchingLineIndices.length,
197
+ metadata: entry.metadata,
198
+ };
199
+ }
200
+ // Apply offset and limit
201
+ const totalMatches = matchingLineIndices.length;
202
+ let selectedIndices = matchingLineIndices.slice(offset);
203
+ const truncated = headLimit !== undefined && selectedIndices.length > headLimit;
204
+ if (headLimit !== undefined) {
205
+ selectedIndices = selectedIndices.slice(0, headLimit);
206
+ }
207
+ // Build matches with context
208
+ const matches = [];
209
+ for (const lineIndex of selectedIndices) {
210
+ const beforeLines = [];
211
+ const afterLines = [];
212
+ // Collect before context
213
+ for (let i = Math.max(0, lineIndex - before); i < lineIndex; i++) {
214
+ beforeLines.push(lines[i]);
215
+ }
216
+ // Collect after context
217
+ for (let i = lineIndex + 1; i <= Math.min(lines.length - 1, lineIndex + after); i++) {
218
+ afterLines.push(lines[i]);
219
+ }
220
+ matches.push({
221
+ lineNumber: lineIndex + 1, // 1-based line numbers
222
+ line: lines[lineIndex],
223
+ before: beforeLines,
224
+ after: afterLines,
225
+ });
226
+ }
227
+ return {
228
+ bufferId,
229
+ pattern,
230
+ totalMatches,
231
+ matches,
232
+ truncated,
233
+ metadata: entry.metadata,
234
+ };
235
+ }
236
+ /**
237
+ * Edit buffer content by replacing old_string with new_string
238
+ */
239
+ edit(bufferId, oldString, newString, replaceAll = false) {
240
+ const entry = this.buffers.get(bufferId);
241
+ if (!entry) {
242
+ return null;
243
+ }
244
+ // Check if expired
245
+ if (this.isExpired(entry)) {
246
+ this.buffers.delete(bufferId);
247
+ return null;
248
+ }
249
+ const content = entry.content;
250
+ const oldSize = content.length;
251
+ // Count occurrences
252
+ let occurrences = 0;
253
+ let searchIndex = 0;
254
+ while (true) {
255
+ const foundIndex = content.indexOf(oldString, searchIndex);
256
+ if (foundIndex === -1)
257
+ break;
258
+ occurrences++;
259
+ searchIndex = foundIndex + oldString.length;
260
+ }
261
+ // Check for errors
262
+ if (occurrences === 0) {
263
+ return {
264
+ error: true,
265
+ message: "old_string not found in buffer",
266
+ occurrences: 0,
267
+ };
268
+ }
269
+ if (occurrences > 1 && !replaceAll) {
270
+ return {
271
+ error: true,
272
+ message: `old_string found ${occurrences} times. Use replace_all=true to replace all, or provide more context.`,
273
+ occurrences,
274
+ };
275
+ }
276
+ // Perform replacement
277
+ let newContent;
278
+ let replacements;
279
+ if (replaceAll) {
280
+ newContent = content.split(oldString).join(newString);
281
+ replacements = occurrences;
282
+ }
283
+ else {
284
+ newContent = content.replace(oldString, newString);
285
+ replacements = 1;
286
+ }
287
+ // Update buffer in place and reset TTL to 1 day
288
+ entry.content = newContent;
289
+ entry.totalSize = newContent.length;
290
+ entry.modifiedAt = Date.now();
291
+ entry.ttl = this.modifiedTTL;
292
+ return {
293
+ bufferId,
294
+ success: true,
295
+ replacements,
296
+ oldSize,
297
+ newSize: newContent.length,
298
+ metadata: entry.metadata,
299
+ };
300
+ }
301
+ /**
302
+ * Clean up expired buffers
303
+ */
304
+ cleanup() {
305
+ for (const [bufferId, entry] of this.buffers.entries()) {
306
+ if (this.isExpired(entry)) {
307
+ this.buffers.delete(bufferId);
308
+ }
309
+ }
310
+ }
311
+ /**
312
+ * Generate a unique buffer ID
313
+ */
314
+ generateId() {
315
+ return `buf_${randomBytes(12).toString("hex")}`;
316
+ }
317
+ /**
318
+ * Stop the cleanup interval (for graceful shutdown)
319
+ */
320
+ destroy() {
321
+ if (this.cleanupInterval) {
322
+ clearInterval(this.cleanupInterval);
323
+ this.cleanupInterval = null;
324
+ }
325
+ this.buffers.clear();
326
+ }
327
+ }
328
+ // Singleton instance for use across the application
329
+ export const contentBuffer = new ContentBuffer();
330
+ //# sourceMappingURL=content-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-buffer.js","sourceRoot":"","sources":["../../src/utils/content-buffer.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,11 @@
2
2
  * Response formatting utilities for MCP tools
3
3
  */
4
4
  import type { ToolResult, ApiError } from "../types.js";
5
- export declare function formatSuccess(data: unknown): ToolResult;
5
+ /**
6
+ * Get the maximum output size from environment variable or default
7
+ */
8
+ export declare function getMaxOutputSize(): number;
9
+ export declare function formatSuccess(data: unknown, metadata?: Record<string, unknown>): ToolResult;
6
10
  export declare function formatError(error: ApiError | Error): ToolResult;
7
11
  export declare function isApiError(error: unknown): error is ApiError;
8
12
  //# sourceMappingURL=response-formatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"response-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CASvD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,UAAU,CAmB/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAO5D"}
1
+ {"version":3,"file":"response-formatter.d.ts","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMxD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CASzC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CA8C3F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,GAAG,UAAU,CAmB/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAO5D"}
@@ -1,12 +1,62 @@
1
1
  /**
2
2
  * Response formatting utilities for MCP tools
3
3
  */
4
- export function formatSuccess(data) {
4
+ import { contentBuffer } from "./content-buffer.js";
5
+ // Default max output size (16KB), configurable via JICON_MAX_OUTPUT env var
6
+ const DEFAULT_MAX_OUTPUT = 16000;
7
+ /**
8
+ * Get the maximum output size from environment variable or default
9
+ */
10
+ export function getMaxOutputSize() {
11
+ const envValue = process.env.JICON_MAX_OUTPUT;
12
+ if (envValue) {
13
+ const parsed = parseInt(envValue, 10);
14
+ if (!isNaN(parsed) && parsed > 0) {
15
+ return parsed;
16
+ }
17
+ }
18
+ return DEFAULT_MAX_OUTPUT;
19
+ }
20
+ export function formatSuccess(data, metadata) {
21
+ const maxSize = getMaxOutputSize();
22
+ const jsonText = JSON.stringify(data, null, 2);
23
+ // If within limit, return directly
24
+ if (jsonText.length <= maxSize) {
25
+ return {
26
+ content: [
27
+ {
28
+ type: "text",
29
+ text: jsonText,
30
+ },
31
+ ],
32
+ };
33
+ }
34
+ // Exceeds limit: store in buffer and return pagination info only
35
+ const bufferId = contentBuffer.store(jsonText, metadata);
5
36
  return {
6
37
  content: [
7
38
  {
8
39
  type: "text",
9
- text: JSON.stringify(data, null, 2),
40
+ text: JSON.stringify({
41
+ _pagination: true,
42
+ status: "SUCCESS - Data retrieved and buffered",
43
+ warning: "DO NOT retry or modify this query. The data is already available in the buffer below.",
44
+ instruction: "Use buffer_get_chunk with the bufferId to retrieve the content in chunks.",
45
+ recommendation: "For complex analysis of large data, consider spawning a sub-agent (Task tool) with the bufferId to process efficiently without consuming main conversation context.",
46
+ bufferId,
47
+ totalSize: jsonText.length,
48
+ limit: maxSize,
49
+ hasMore: true,
50
+ next_action: {
51
+ tool: "buffer_get_chunk",
52
+ args: { bufferId, offset: 0, limit: 5000 },
53
+ },
54
+ alternative_actions: {
55
+ search: { tool: "buffer_grep", args: { bufferId, pattern: "your_search_term" } },
56
+ list: { tool: "buffer_list", args: {} },
57
+ subagent: { tool: "Task", args: { prompt: "Analyze bufferId: " + bufferId } },
58
+ },
59
+ }, null, 2),
10
60
  },
11
61
  ],
12
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,QAAQ,GACZ,KAAK,YAAY,KAAK;QACpB,CAAC,CAAC;YACE,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;SAChC;QACH,CAAC,CAAC,KAAK,CAAC;IAEZ,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,KAAK,CAAC,KAAK,KAAK,IAAI,CACrB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"response-formatter.js","sourceRoot":"","sources":["../../src/utils/response-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Workload calculation utility tools for MCP Server
3
+ *
4
+ * Provides tools to convert between time units and sum workload values.
5
+ * Pure computation - no API calls.
6
+ */
7
+ import { z } from "zod";
8
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
9
+ export declare function createWorkloadTools(): {
10
+ workload_convert: {
11
+ description: string;
12
+ inputSchema: z.ZodObject<{
13
+ value: z.ZodNumber;
14
+ unit: z.ZodEnum<["seconds", "hours", "days"]>;
15
+ hoursPerDay: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ value: number;
18
+ unit: "hours" | "seconds" | "days";
19
+ hoursPerDay: number;
20
+ }, {
21
+ value: number;
22
+ unit: "hours" | "seconds" | "days";
23
+ hoursPerDay?: number | undefined;
24
+ }>;
25
+ handler: (args: {
26
+ value: number;
27
+ unit: "seconds" | "hours" | "days";
28
+ hoursPerDay?: number;
29
+ }) => Promise<CallToolResult>;
30
+ };
31
+ workload_sum: {
32
+ description: string;
33
+ inputSchema: z.ZodObject<{
34
+ values: z.ZodArray<z.ZodObject<{
35
+ value: z.ZodNumber;
36
+ unit: z.ZodEnum<["seconds", "hours", "days"]>;
37
+ }, "strip", z.ZodTypeAny, {
38
+ value: number;
39
+ unit: "hours" | "seconds" | "days";
40
+ }, {
41
+ value: number;
42
+ unit: "hours" | "seconds" | "days";
43
+ }>, "many">;
44
+ hoursPerDay: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
45
+ }, "strip", z.ZodTypeAny, {
46
+ values: {
47
+ value: number;
48
+ unit: "hours" | "seconds" | "days";
49
+ }[];
50
+ hoursPerDay: number;
51
+ }, {
52
+ values: {
53
+ value: number;
54
+ unit: "hours" | "seconds" | "days";
55
+ }[];
56
+ hoursPerDay?: number | undefined;
57
+ }>;
58
+ handler: (args: {
59
+ values: Array<{
60
+ value: number;
61
+ unit: "seconds" | "hours" | "days";
62
+ }>;
63
+ hoursPerDay?: number;
64
+ }) => Promise<CallToolResult>;
65
+ };
66
+ };
67
+ export declare const WORKLOAD_TOOLS: readonly ["workload_convert", "workload_sum"];
68
+ //# sourceMappingURL=workload-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload-tools.d.ts","sourceRoot":"","sources":["../../src/utils/workload-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AA4CzE,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;wBAwBP;YACpB,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;YACnC,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,KAAG,OAAO,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAiDL;YACpB,MAAM,EAAE,KAAK,CAAC;gBAAE,KAAK,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;aAAE,CAAC,CAAC;YACrE,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,KAAG,OAAO,CAAC,cAAc,CAAC;;EAyBhC;AAGD,eAAO,MAAM,cAAc,+CAAgD,CAAC"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Workload calculation utility tools for MCP Server
3
+ *
4
+ * Provides tools to convert between time units and sum workload values.
5
+ * Pure computation - no API calls.
6
+ */
7
+ import { z } from "zod";
8
+ import { formatSuccess } from "./response-formatter.js";
9
+ const SECONDS_PER_HOUR = 3600;
10
+ /**
11
+ * Format seconds to human-readable workload string
12
+ */
13
+ function formatWorkload(seconds, hoursPerDay = 8) {
14
+ const hours = seconds / SECONDS_PER_HOUR;
15
+ const days = hours / hoursPerDay;
16
+ // Build formatted string
17
+ const parts = [];
18
+ if (days >= 1) {
19
+ const wholeDays = Math.floor(days);
20
+ const remainingHours = hours - wholeDays * hoursPerDay;
21
+ parts.push(`${wholeDays}d`);
22
+ if (remainingHours >= 0.5) {
23
+ parts.push(`${remainingHours.toFixed(1)}h`);
24
+ }
25
+ }
26
+ else if (hours >= 1) {
27
+ parts.push(`${hours.toFixed(1)}h`);
28
+ }
29
+ else {
30
+ const minutes = Math.floor(seconds / 60);
31
+ parts.push(`${minutes}m`);
32
+ }
33
+ return {
34
+ seconds,
35
+ hours: parseFloat(hours.toFixed(2)),
36
+ days: parseFloat(days.toFixed(2)),
37
+ formatted: parts.join(" ") || "0m",
38
+ };
39
+ }
40
+ export function createWorkloadTools() {
41
+ return {
42
+ workload_convert: {
43
+ description: `Convert workload time between units (seconds, hours, days).
44
+
45
+ Uses configurable hours per day (default: 8h = 1 day).
46
+
47
+ Input:
48
+ - value: Time value to convert
49
+ - unit: Source unit ("seconds", "hours", or "days")
50
+ - hoursPerDay: Hours per workday (default: 8)
51
+
52
+ Output: Equivalent values in all units with formatted string.
53
+
54
+ Example: Convert 28800 seconds → 8h → 1d`,
55
+ inputSchema: z.object({
56
+ value: z.number().describe("Time value to convert"),
57
+ unit: z.enum(["seconds", "hours", "days"]).describe("Source unit"),
58
+ hoursPerDay: z
59
+ .number()
60
+ .optional()
61
+ .default(8)
62
+ .describe("Hours per workday (default: 8)"),
63
+ }),
64
+ handler: async (args) => {
65
+ const { value, unit, hoursPerDay = 8 } = args;
66
+ // Convert to seconds first
67
+ let seconds;
68
+ switch (unit) {
69
+ case "seconds":
70
+ seconds = value;
71
+ break;
72
+ case "hours":
73
+ seconds = value * SECONDS_PER_HOUR;
74
+ break;
75
+ case "days":
76
+ seconds = value * hoursPerDay * SECONDS_PER_HOUR;
77
+ break;
78
+ }
79
+ return formatSuccess(formatWorkload(seconds, hoursPerDay));
80
+ },
81
+ },
82
+ workload_sum: {
83
+ description: `Sum multiple workload values and return total in all units.
84
+
85
+ Accepts an array of time values with their units.
86
+ Returns: total in seconds, hours, days, and formatted string.
87
+
88
+ Input:
89
+ - values: Array of { value: number, unit: "seconds"|"hours"|"days" }
90
+ - hoursPerDay: Hours per workday (default: 8)
91
+
92
+ Example: Sum [3600 seconds, 2 hours, 0.5 days] → total in all units`,
93
+ inputSchema: z.object({
94
+ values: z
95
+ .array(z.object({
96
+ value: z.number().describe("Time value"),
97
+ unit: z
98
+ .enum(["seconds", "hours", "days"])
99
+ .describe("Unit of this value"),
100
+ }))
101
+ .describe("Array of workload values to sum"),
102
+ hoursPerDay: z
103
+ .number()
104
+ .optional()
105
+ .default(8)
106
+ .describe("Hours per workday (default: 8)"),
107
+ }),
108
+ handler: async (args) => {
109
+ const { values, hoursPerDay = 8 } = args;
110
+ let totalSeconds = 0;
111
+ for (const { value, unit } of values) {
112
+ switch (unit) {
113
+ case "seconds":
114
+ totalSeconds += value;
115
+ break;
116
+ case "hours":
117
+ totalSeconds += value * SECONDS_PER_HOUR;
118
+ break;
119
+ case "days":
120
+ totalSeconds += value * hoursPerDay * SECONDS_PER_HOUR;
121
+ break;
122
+ }
123
+ }
124
+ return formatSuccess({
125
+ itemCount: values.length,
126
+ ...formatWorkload(totalSeconds, hoursPerDay),
127
+ });
128
+ },
129
+ },
130
+ };
131
+ }
132
+ // Tool names for registry
133
+ export const WORKLOAD_TOOLS = ["workload_convert", "workload_sum"];
134
+ //# sourceMappingURL=workload-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workload-tools.js","sourceRoot":"","sources":["../../src/utils/workload-tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crypto512/jicon-mcp",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "description": "Model Context Protocol server for Jira, Confluence, and Tempo integration",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",