@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.
- package/CLAUDE.md +252 -27
- package/README.md +237 -34
- package/TOOL_LIST.md +201 -5
- package/dist/config/types.d.ts +6 -6
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +3 -2
- package/dist/config/types.js.map +1 -1
- package/dist/confluence/client.d.ts +8 -16
- package/dist/confluence/client.d.ts.map +1 -1
- package/dist/confluence/client.js +75 -43
- package/dist/confluence/client.js.map +1 -1
- package/dist/confluence/formatters.d.ts +4 -0
- package/dist/confluence/formatters.d.ts.map +1 -1
- package/dist/confluence/formatters.js +19 -0
- package/dist/confluence/formatters.js.map +1 -1
- package/dist/confluence/tools.d.ts +9 -36
- package/dist/confluence/tools.d.ts.map +1 -1
- package/dist/confluence/tools.js +90 -158
- package/dist/confluence/tools.js.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/jira/client.d.ts +9 -9
- package/dist/jira/client.d.ts.map +1 -1
- package/dist/jira/client.js +252 -30
- package/dist/jira/client.js.map +1 -1
- package/dist/jira/formatters.d.ts +4 -0
- package/dist/jira/formatters.d.ts.map +1 -1
- package/dist/jira/formatters.js +24 -0
- package/dist/jira/formatters.js.map +1 -1
- package/dist/jira/tools.d.ts +36 -36
- package/dist/jira/tools.d.ts.map +1 -1
- package/dist/jira/tools.js +161 -139
- package/dist/jira/tools.js.map +1 -1
- package/dist/jira/types.d.ts +50 -0
- package/dist/jira/types.d.ts.map +1 -1
- package/dist/permissions/filter.d.ts.map +1 -1
- package/dist/permissions/filter.js +42 -13
- package/dist/permissions/filter.js.map +1 -1
- package/dist/permissions/tool-registry.d.ts +33 -14
- package/dist/permissions/tool-registry.d.ts.map +1 -1
- package/dist/permissions/tool-registry.js +80 -5
- package/dist/permissions/tool-registry.js.map +1 -1
- package/dist/tempo/client.d.ts +1 -0
- package/dist/tempo/client.d.ts.map +1 -1
- package/dist/tempo/client.js +43 -0
- package/dist/tempo/client.js.map +1 -1
- package/dist/tempo/formatters.d.ts +4 -0
- package/dist/tempo/formatters.d.ts.map +1 -1
- package/dist/tempo/formatters.js +24 -0
- package/dist/tempo/formatters.js.map +1 -1
- package/dist/tempo/tools.d.ts +21 -0
- package/dist/tempo/tools.d.ts.map +1 -1
- package/dist/tempo/tools.js +74 -134
- package/dist/tempo/tools.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/buffer-tools.d.ts +128 -0
- package/dist/utils/buffer-tools.d.ts.map +1 -0
- package/dist/utils/buffer-tools.js +312 -0
- package/dist/utils/buffer-tools.js.map +1 -0
- package/dist/utils/content-buffer.d.ts +132 -0
- package/dist/utils/content-buffer.d.ts.map +1 -0
- package/dist/utils/content-buffer.js +313 -0
- package/dist/utils/content-buffer.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +5 -1
- package/dist/utils/response-formatter.d.ts.map +1 -1
- package/dist/utils/response-formatter.js +52 -2
- package/dist/utils/response-formatter.js.map +1 -1
- package/dist/utils/workload-tools.d.ts +68 -0
- package/dist/utils/workload-tools.d.ts.map +1 -0
- package/dist/utils/workload-tools.js +134 -0
- package/dist/utils/workload-tools.js.map +1 -0
- 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
|
-
|
|
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;
|
|
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
|
-
|
|
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(
|
|
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;
|
|
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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"}
|