@crypto512/jicon-mcp 0.6.1 → 0.7.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.
Files changed (74) hide show
  1. package/CLAUDE.md +252 -27
  2. package/README.md +237 -34
  3. package/TOOL_LIST.md +201 -5
  4. package/dist/config/types.d.ts +6 -6
  5. package/dist/config/types.d.ts.map +1 -1
  6. package/dist/config/types.js +3 -2
  7. package/dist/config/types.js.map +1 -1
  8. package/dist/confluence/client.d.ts +8 -16
  9. package/dist/confluence/client.d.ts.map +1 -1
  10. package/dist/confluence/client.js +75 -43
  11. package/dist/confluence/client.js.map +1 -1
  12. package/dist/confluence/formatters.d.ts +4 -0
  13. package/dist/confluence/formatters.d.ts.map +1 -1
  14. package/dist/confluence/formatters.js +19 -0
  15. package/dist/confluence/formatters.js.map +1 -1
  16. package/dist/confluence/tools.d.ts +9 -36
  17. package/dist/confluence/tools.d.ts.map +1 -1
  18. package/dist/confluence/tools.js +90 -158
  19. package/dist/confluence/tools.js.map +1 -1
  20. package/dist/index.js +9 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/jira/client.d.ts +9 -9
  23. package/dist/jira/client.d.ts.map +1 -1
  24. package/dist/jira/client.js +252 -30
  25. package/dist/jira/client.js.map +1 -1
  26. package/dist/jira/formatters.d.ts +4 -0
  27. package/dist/jira/formatters.d.ts.map +1 -1
  28. package/dist/jira/formatters.js +24 -0
  29. package/dist/jira/formatters.js.map +1 -1
  30. package/dist/jira/tools.d.ts +36 -36
  31. package/dist/jira/tools.d.ts.map +1 -1
  32. package/dist/jira/tools.js +161 -139
  33. package/dist/jira/tools.js.map +1 -1
  34. package/dist/jira/types.d.ts +50 -0
  35. package/dist/jira/types.d.ts.map +1 -1
  36. package/dist/permissions/filter.d.ts.map +1 -1
  37. package/dist/permissions/filter.js +42 -13
  38. package/dist/permissions/filter.js.map +1 -1
  39. package/dist/permissions/tool-registry.d.ts +33 -14
  40. package/dist/permissions/tool-registry.d.ts.map +1 -1
  41. package/dist/permissions/tool-registry.js +80 -5
  42. package/dist/permissions/tool-registry.js.map +1 -1
  43. package/dist/tempo/client.d.ts +1 -0
  44. package/dist/tempo/client.d.ts.map +1 -1
  45. package/dist/tempo/client.js +43 -0
  46. package/dist/tempo/client.js.map +1 -1
  47. package/dist/tempo/formatters.d.ts +4 -0
  48. package/dist/tempo/formatters.d.ts.map +1 -1
  49. package/dist/tempo/formatters.js +24 -0
  50. package/dist/tempo/formatters.js.map +1 -1
  51. package/dist/tempo/tools.d.ts +21 -0
  52. package/dist/tempo/tools.d.ts.map +1 -1
  53. package/dist/tempo/tools.js +74 -134
  54. package/dist/tempo/tools.js.map +1 -1
  55. package/dist/types.d.ts +1 -0
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/types.js.map +1 -1
  58. package/dist/utils/buffer-tools.d.ts +128 -0
  59. package/dist/utils/buffer-tools.d.ts.map +1 -0
  60. package/dist/utils/buffer-tools.js +312 -0
  61. package/dist/utils/buffer-tools.js.map +1 -0
  62. package/dist/utils/content-buffer.d.ts +132 -0
  63. package/dist/utils/content-buffer.d.ts.map +1 -0
  64. package/dist/utils/content-buffer.js +313 -0
  65. package/dist/utils/content-buffer.js.map +1 -0
  66. package/dist/utils/response-formatter.d.ts +5 -1
  67. package/dist/utils/response-formatter.d.ts.map +1 -1
  68. package/dist/utils/response-formatter.js +52 -2
  69. package/dist/utils/response-formatter.js.map +1 -1
  70. package/dist/utils/workload-tools.d.ts +68 -0
  71. package/dist/utils/workload-tools.d.ts.map +1 -0
  72. package/dist/utils/workload-tools.js +134 -0
  73. package/dist/utils/workload-tools.js.map +1 -0
  74. package/package.json +1 -1
@@ -0,0 +1,313 @@
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
+ cleanupInterval = null;
12
+ defaultChunkSize;
13
+ constructor(options) {
14
+ this.buffers = new Map();
15
+ this.defaultTTL = options?.defaultTTL ?? 10 * 60 * 1000; // 10 minutes
16
+ this.defaultChunkSize = options?.defaultChunkSize ?? 5000;
17
+ // Start periodic cleanup
18
+ const cleanupMs = options?.cleanupIntervalMs ?? 60 * 1000; // 1 minute
19
+ this.cleanupInterval = setInterval(() => this.cleanup(), cleanupMs);
20
+ // Ensure cleanup interval doesn't prevent process exit
21
+ if (this.cleanupInterval.unref) {
22
+ this.cleanupInterval.unref();
23
+ }
24
+ }
25
+ /**
26
+ * Store content in the buffer and return a unique buffer ID
27
+ */
28
+ store(content, metadata, ttl) {
29
+ const bufferId = this.generateId();
30
+ const entry = {
31
+ content,
32
+ totalSize: content.length,
33
+ createdAt: Date.now(),
34
+ ttl: ttl ?? this.defaultTTL,
35
+ metadata,
36
+ };
37
+ this.buffers.set(bufferId, entry);
38
+ return bufferId;
39
+ }
40
+ /**
41
+ * Get a chunk of content from the buffer
42
+ */
43
+ getChunk(bufferId, offset = 0, limit = this.defaultChunkSize) {
44
+ const entry = this.buffers.get(bufferId);
45
+ if (!entry) {
46
+ return null;
47
+ }
48
+ // Check if expired
49
+ if (Date.now() - entry.createdAt > entry.ttl) {
50
+ this.buffers.delete(bufferId);
51
+ return null;
52
+ }
53
+ const chunk = entry.content.slice(offset, offset + limit);
54
+ const endOffset = offset + chunk.length;
55
+ const hasMore = endOffset < entry.totalSize;
56
+ return {
57
+ bufferId,
58
+ chunk,
59
+ offset,
60
+ limit,
61
+ totalSize: entry.totalSize,
62
+ hasMore,
63
+ metadata: entry.metadata,
64
+ };
65
+ }
66
+ /**
67
+ * Check if a buffer exists and is valid
68
+ */
69
+ has(bufferId) {
70
+ const entry = this.buffers.get(bufferId);
71
+ if (!entry) {
72
+ return false;
73
+ }
74
+ if (Date.now() - entry.createdAt > entry.ttl) {
75
+ this.buffers.delete(bufferId);
76
+ return false;
77
+ }
78
+ return true;
79
+ }
80
+ /**
81
+ * Get buffer info without content
82
+ */
83
+ getInfo(bufferId) {
84
+ const entry = this.buffers.get(bufferId);
85
+ if (!entry) {
86
+ return null;
87
+ }
88
+ if (Date.now() - entry.createdAt > entry.ttl) {
89
+ this.buffers.delete(bufferId);
90
+ return null;
91
+ }
92
+ return {
93
+ bufferId,
94
+ totalSize: entry.totalSize,
95
+ createdAt: entry.createdAt,
96
+ expiresAt: entry.createdAt + entry.ttl,
97
+ metadata: entry.metadata,
98
+ };
99
+ }
100
+ /**
101
+ * List all active buffers
102
+ */
103
+ list() {
104
+ const now = Date.now();
105
+ const result = [];
106
+ for (const [bufferId, entry] of this.buffers.entries()) {
107
+ if (now - entry.createdAt > entry.ttl) {
108
+ this.buffers.delete(bufferId);
109
+ continue;
110
+ }
111
+ result.push({
112
+ bufferId,
113
+ totalSize: entry.totalSize,
114
+ createdAt: entry.createdAt,
115
+ expiresAt: entry.createdAt + entry.ttl,
116
+ metadata: entry.metadata,
117
+ });
118
+ }
119
+ return result;
120
+ }
121
+ /**
122
+ * Clear a specific buffer or all buffers
123
+ */
124
+ clear(bufferId) {
125
+ if (bufferId) {
126
+ return this.buffers.delete(bufferId);
127
+ }
128
+ this.buffers.clear();
129
+ return true;
130
+ }
131
+ /**
132
+ * Get the number of active buffers
133
+ */
134
+ size() {
135
+ return this.buffers.size;
136
+ }
137
+ /**
138
+ * Search buffer content for a pattern with context lines
139
+ */
140
+ grep(bufferId, pattern, options = {}) {
141
+ const entry = this.buffers.get(bufferId);
142
+ if (!entry) {
143
+ return null;
144
+ }
145
+ // Check if expired
146
+ if (Date.now() - entry.createdAt > entry.ttl) {
147
+ this.buffers.delete(bufferId);
148
+ return null;
149
+ }
150
+ const { caseInsensitive = false, before = 0, after = 0, multiline = false, countOnly = false, headLimit, offset = 0, } = options;
151
+ // Build regex flags
152
+ let flags = "g";
153
+ if (caseInsensitive)
154
+ flags += "i";
155
+ if (multiline)
156
+ flags += "ms";
157
+ let regex;
158
+ try {
159
+ regex = new RegExp(pattern, flags);
160
+ }
161
+ catch {
162
+ return null; // Invalid regex
163
+ }
164
+ const content = entry.content;
165
+ const lines = content.split("\n");
166
+ // Find all matching line indices
167
+ const matchingLineIndices = [];
168
+ for (let i = 0; i < lines.length; i++) {
169
+ if (regex.test(lines[i])) {
170
+ matchingLineIndices.push(i);
171
+ }
172
+ // Reset regex lastIndex for global flag
173
+ regex.lastIndex = 0;
174
+ }
175
+ // Count only mode
176
+ if (countOnly) {
177
+ return {
178
+ bufferId,
179
+ pattern,
180
+ count: matchingLineIndices.length,
181
+ metadata: entry.metadata,
182
+ };
183
+ }
184
+ // Apply offset and limit
185
+ const totalMatches = matchingLineIndices.length;
186
+ let selectedIndices = matchingLineIndices.slice(offset);
187
+ const truncated = headLimit !== undefined && selectedIndices.length > headLimit;
188
+ if (headLimit !== undefined) {
189
+ selectedIndices = selectedIndices.slice(0, headLimit);
190
+ }
191
+ // Build matches with context
192
+ const matches = [];
193
+ for (const lineIndex of selectedIndices) {
194
+ const beforeLines = [];
195
+ const afterLines = [];
196
+ // Collect before context
197
+ for (let i = Math.max(0, lineIndex - before); i < lineIndex; i++) {
198
+ beforeLines.push(lines[i]);
199
+ }
200
+ // Collect after context
201
+ for (let i = lineIndex + 1; i <= Math.min(lines.length - 1, lineIndex + after); i++) {
202
+ afterLines.push(lines[i]);
203
+ }
204
+ matches.push({
205
+ lineNumber: lineIndex + 1, // 1-based line numbers
206
+ line: lines[lineIndex],
207
+ before: beforeLines,
208
+ after: afterLines,
209
+ });
210
+ }
211
+ return {
212
+ bufferId,
213
+ pattern,
214
+ totalMatches,
215
+ matches,
216
+ truncated,
217
+ metadata: entry.metadata,
218
+ };
219
+ }
220
+ /**
221
+ * Edit buffer content by replacing old_string with new_string
222
+ */
223
+ edit(bufferId, oldString, newString, replaceAll = false) {
224
+ const entry = this.buffers.get(bufferId);
225
+ if (!entry) {
226
+ return null;
227
+ }
228
+ // Check if expired
229
+ if (Date.now() - entry.createdAt > entry.ttl) {
230
+ this.buffers.delete(bufferId);
231
+ return null;
232
+ }
233
+ const content = entry.content;
234
+ const oldSize = content.length;
235
+ // Count occurrences
236
+ let occurrences = 0;
237
+ let searchIndex = 0;
238
+ while (true) {
239
+ const foundIndex = content.indexOf(oldString, searchIndex);
240
+ if (foundIndex === -1)
241
+ break;
242
+ occurrences++;
243
+ searchIndex = foundIndex + oldString.length;
244
+ }
245
+ // Check for errors
246
+ if (occurrences === 0) {
247
+ return {
248
+ error: true,
249
+ message: "old_string not found in buffer",
250
+ occurrences: 0,
251
+ };
252
+ }
253
+ if (occurrences > 1 && !replaceAll) {
254
+ return {
255
+ error: true,
256
+ message: `old_string found ${occurrences} times. Use replace_all=true to replace all, or provide more context.`,
257
+ occurrences,
258
+ };
259
+ }
260
+ // Perform replacement
261
+ let newContent;
262
+ let replacements;
263
+ if (replaceAll) {
264
+ newContent = content.split(oldString).join(newString);
265
+ replacements = occurrences;
266
+ }
267
+ else {
268
+ newContent = content.replace(oldString, newString);
269
+ replacements = 1;
270
+ }
271
+ // Update buffer in place
272
+ entry.content = newContent;
273
+ entry.totalSize = newContent.length;
274
+ return {
275
+ bufferId,
276
+ success: true,
277
+ replacements,
278
+ oldSize,
279
+ newSize: newContent.length,
280
+ metadata: entry.metadata,
281
+ };
282
+ }
283
+ /**
284
+ * Clean up expired buffers
285
+ */
286
+ cleanup() {
287
+ const now = Date.now();
288
+ for (const [bufferId, entry] of this.buffers.entries()) {
289
+ if (now - entry.createdAt > entry.ttl) {
290
+ this.buffers.delete(bufferId);
291
+ }
292
+ }
293
+ }
294
+ /**
295
+ * Generate a unique buffer ID
296
+ */
297
+ generateId() {
298
+ return `buf_${randomBytes(12).toString("hex")}`;
299
+ }
300
+ /**
301
+ * Stop the cleanup interval (for graceful shutdown)
302
+ */
303
+ destroy() {
304
+ if (this.cleanupInterval) {
305
+ clearInterval(this.cleanupInterval);
306
+ this.cleanupInterval = null;
307
+ }
308
+ this.buffers.clear();
309
+ }
310
+ }
311
+ // Singleton instance for use across the application
312
+ export const contentBuffer = new ContentBuffer();
313
+ //# 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.0",
4
4
  "description": "Model Context Protocol server for Jira, Confluence, and Tempo integration",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",