@zebpay_rajesh/zebpay-mcp-server 0.1.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.
Potentially problematic release.
This version of @zebpay_rajesh/zebpay-mcp-server might be problematic. Click here for more details.
- package/.env.example +14 -0
- package/README.md +223 -0
- package/dist/__tests__/errors.test.d.ts +5 -0
- package/dist/__tests__/errors.test.js +147 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/prompts.test.d.ts +1 -0
- package/dist/__tests__/prompts.test.js +73 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- package/dist/__tests__/resources.test.d.ts +1 -0
- package/dist/__tests__/resources.test.js +79 -0
- package/dist/__tests__/resources.test.js.map +1 -0
- package/dist/__tests__/validation.test.d.ts +15 -0
- package/dist/__tests__/validation.test.js +64 -0
- package/dist/__tests__/validation.test.js.map +1 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +81 -0
- package/dist/config.js.map +1 -0
- package/dist/http/httpClient.d.ts +40 -0
- package/dist/http/httpClient.js +341 -0
- package/dist/http/httpClient.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +21 -0
- package/dist/mcp/errors.js +214 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/logging.d.ts +21 -0
- package/dist/mcp/logging.js +241 -0
- package/dist/mcp/logging.js.map +1 -0
- package/dist/mcp/prompts.d.ts +9 -0
- package/dist/mcp/prompts.js +165 -0
- package/dist/mcp/prompts.js.map +1 -0
- package/dist/mcp/resources.d.ts +9 -0
- package/dist/mcp/resources.js +125 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/tools_futures.d.ts +5 -0
- package/dist/mcp/tools_futures.js +694 -0
- package/dist/mcp/tools_futures.js.map +1 -0
- package/dist/mcp/tools_spot.d.ts +11 -0
- package/dist/mcp/tools_spot.js +2225 -0
- package/dist/mcp/tools_spot.js.map +1 -0
- package/dist/private/FuturesClient.d.ts +57 -0
- package/dist/private/FuturesClient.js +181 -0
- package/dist/private/FuturesClient.js.map +1 -0
- package/dist/private/SpotClient.d.ts +44 -0
- package/dist/private/SpotClient.js +201 -0
- package/dist/private/SpotClient.js.map +1 -0
- package/dist/private/ZebpayAPI.d.ts +19 -0
- package/dist/private/ZebpayAPI.js +172 -0
- package/dist/private/ZebpayAPI.js.map +1 -0
- package/dist/public/PublicClient.d.ts +79 -0
- package/dist/public/PublicClient.js +283 -0
- package/dist/public/PublicClient.js.map +1 -0
- package/dist/public/PublicFuturesClient.d.ts +27 -0
- package/dist/public/PublicFuturesClient.js +187 -0
- package/dist/public/PublicFuturesClient.js.map +1 -0
- package/dist/security/credentials.d.ts +42 -0
- package/dist/security/credentials.js +80 -0
- package/dist/security/credentials.js.map +1 -0
- package/dist/security/signing.d.ts +33 -0
- package/dist/security/signing.js +56 -0
- package/dist/security/signing.js.map +1 -0
- package/dist/types/responses.d.ts +130 -0
- package/dist/types/responses.js +6 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/utils/cache.d.ts +29 -0
- package/dist/utils/cache.js +72 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/fileLogger.d.ts +10 -0
- package/dist/utils/fileLogger.js +81 -0
- package/dist/utils/fileLogger.js.map +1 -0
- package/dist/utils/metrics.d.ts +35 -0
- package/dist/utils/metrics.js +94 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/responseFormatter.d.ts +93 -0
- package/dist/utils/responseFormatter.js +268 -0
- package/dist/utils/responseFormatter.js.map +1 -0
- package/dist/validation/schemas.d.ts +70 -0
- package/dist/validation/schemas.js +48 -0
- package/dist/validation/schemas.js.map +1 -0
- package/dist/validation/validators.d.ts +28 -0
- package/dist/validation/validators.js +129 -0
- package/dist/validation/validators.js.map +1 -0
- package/docs/LOGGING.md +371 -0
- package/docs/zebpay-ai-trading-beginner.png +0 -0
- package/mcp-config.json.example +20 -0
- package/package.json +54 -0
- package/scripts/README.md +103 -0
- package/scripts/clear-logs.js +52 -0
- package/scripts/log-stats.js +264 -0
- package/scripts/log-viewer.js +288 -0
- package/server.json +31 -0
- package/src/__tests__/errors.test.ts +180 -0
- package/src/__tests__/prompts.test.ts +89 -0
- package/src/__tests__/resources.test.ts +95 -0
- package/src/__tests__/validation.test.ts +88 -0
- package/src/config.ts +108 -0
- package/src/http/httpClient.ts +398 -0
- package/src/index.ts +71 -0
- package/src/mcp/errors.ts +262 -0
- package/src/mcp/logging.ts +284 -0
- package/src/mcp/prompts.ts +206 -0
- package/src/mcp/resources.ts +163 -0
- package/src/mcp/tools_futures.ts +874 -0
- package/src/mcp/tools_spot.ts +2702 -0
- package/src/private/FuturesClient.ts +189 -0
- package/src/private/SpotClient.ts +250 -0
- package/src/private/ZebpayAPI.ts +205 -0
- package/src/public/PublicClient.ts +381 -0
- package/src/public/PublicFuturesClient.ts +228 -0
- package/src/security/credentials.ts +114 -0
- package/src/security/signing.ts +98 -0
- package/src/types/responses.ts +146 -0
- package/src/utils/cache.ts +90 -0
- package/src/utils/fileLogger.ts +88 -0
- package/src/utils/metrics.ts +135 -0
- package/src/utils/responseFormatter.ts +361 -0
- package/src/validation/schemas.ts +66 -0
- package/src/validation/validators.ts +189 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/*
|
|
2
|
+
File logging utility for writing logs to both console and file.
|
|
3
|
+
*/
|
|
4
|
+
import { createWriteStream } from "node:fs";
|
|
5
|
+
import { mkdir } from "node:fs/promises";
|
|
6
|
+
import { dirname } from "node:path";
|
|
7
|
+
class FileLogger {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.stream = null;
|
|
10
|
+
this.logPath = null;
|
|
11
|
+
}
|
|
12
|
+
async initialize(logPath) {
|
|
13
|
+
if (!logPath) {
|
|
14
|
+
// Default log path
|
|
15
|
+
this.logPath = null;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
// Ensure log directory exists
|
|
20
|
+
const logDir = dirname(logPath);
|
|
21
|
+
await mkdir(logDir, { recursive: true });
|
|
22
|
+
// Create write stream in append mode
|
|
23
|
+
this.stream = createWriteStream(logPath, { flags: "a" });
|
|
24
|
+
this.logPath = logPath;
|
|
25
|
+
// Write initial log entry
|
|
26
|
+
this.writeToFile(JSON.stringify({
|
|
27
|
+
level: "info",
|
|
28
|
+
type: "log_init",
|
|
29
|
+
timestamp: new Date().toISOString(),
|
|
30
|
+
message: `Logging initialized to file: ${logPath}`,
|
|
31
|
+
}) + "\n");
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error(JSON.stringify({
|
|
35
|
+
level: "error",
|
|
36
|
+
type: "log_init_error",
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
error: error instanceof Error ? error.message : String(error),
|
|
39
|
+
}));
|
|
40
|
+
// Continue without file logging if file can't be opened
|
|
41
|
+
this.stream = null;
|
|
42
|
+
this.logPath = null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
log(message) {
|
|
46
|
+
// Always write to console.error
|
|
47
|
+
console.error(message);
|
|
48
|
+
// Also write to file if initialized
|
|
49
|
+
if (this.stream) {
|
|
50
|
+
this.writeToFile(message + "\n");
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
writeToFile(message) {
|
|
54
|
+
if (this.stream) {
|
|
55
|
+
try {
|
|
56
|
+
this.stream.write(message);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
// If file write fails, log to console but don't crash
|
|
60
|
+
console.error(JSON.stringify({
|
|
61
|
+
level: "error",
|
|
62
|
+
type: "log_write_error",
|
|
63
|
+
timestamp: new Date().toISOString(),
|
|
64
|
+
error: error instanceof Error ? error.message : String(error),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async close() {
|
|
70
|
+
if (this.stream) {
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
this.stream.end(() => {
|
|
73
|
+
this.stream = null;
|
|
74
|
+
resolve();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export const fileLogger = new FileLogger();
|
|
81
|
+
//# sourceMappingURL=fileLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLogger.js","sourceRoot":"","sources":["../../src/utils/fileLogger.ts"],"names":[],"mappings":"AAAA;;EAEE;AAEF,OAAO,EAAE,iBAAiB,EAAe,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU;IAAhB;QACU,WAAM,GAAuB,IAAI,CAAC;QAClC,YAAO,GAAkB,IAAI,CAAC;IA0ExC,CAAC;IAxEC,KAAK,CAAC,UAAU,CAAC,OAAgB;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,mBAAmB;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,qCAAqC;YACrC,IAAI,CAAC,MAAM,GAAG,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;YAEvB,0BAA0B;YAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC9B,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,OAAO,EAAE,gCAAgC,OAAO,EAAE;aACnD,CAAC,GAAG,IAAI,CAAC,CAAC;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3B,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,gBAAgB;gBACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC,CAAC;YACJ,wDAAwD;YACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,OAAe;QACjB,gCAAgC;QAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEvB,oCAAoC;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sDAAsD;gBACtD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;oBAC3B,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,iBAAiB;oBACvB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC7B,IAAI,CAAC,MAAO,CAAC,GAAG,CAAC,GAAG,EAAE;oBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
declare class MetricsCollector {
|
|
2
|
+
private metrics;
|
|
3
|
+
private maxMetrics;
|
|
4
|
+
record(toolName: string, durationMs: number, success: boolean, errorType?: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Get metrics summary for a tool
|
|
7
|
+
*/
|
|
8
|
+
getToolStats(toolName: string, timeWindowMs?: number): {
|
|
9
|
+
count: number;
|
|
10
|
+
successCount: number;
|
|
11
|
+
errorCount: number;
|
|
12
|
+
avgDurationMs: number;
|
|
13
|
+
minDurationMs: number;
|
|
14
|
+
maxDurationMs: number;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Get all tool names
|
|
18
|
+
*/
|
|
19
|
+
getToolNames(): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Get overall stats
|
|
22
|
+
*/
|
|
23
|
+
getOverallStats(timeWindowMs?: number): {
|
|
24
|
+
totalRequests: number;
|
|
25
|
+
successRate: number;
|
|
26
|
+
avgDurationMs: number;
|
|
27
|
+
toolStats: Record<string, ReturnType<MetricsCollector["getToolStats"]>>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Clear all metrics
|
|
31
|
+
*/
|
|
32
|
+
clear(): void;
|
|
33
|
+
}
|
|
34
|
+
export declare const metricsCollector: MetricsCollector;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Basic metrics collection for monitoring tool usage and performance.
|
|
3
|
+
*/
|
|
4
|
+
class MetricsCollector {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.metrics = [];
|
|
7
|
+
this.maxMetrics = 1000; // Keep last 1000 metrics
|
|
8
|
+
}
|
|
9
|
+
record(toolName, durationMs, success, errorType) {
|
|
10
|
+
this.metrics.push({
|
|
11
|
+
toolName,
|
|
12
|
+
timestamp: Date.now(),
|
|
13
|
+
durationMs,
|
|
14
|
+
success,
|
|
15
|
+
errorType,
|
|
16
|
+
});
|
|
17
|
+
// Keep only last N metrics
|
|
18
|
+
if (this.metrics.length > this.maxMetrics) {
|
|
19
|
+
this.metrics = this.metrics.slice(-this.maxMetrics);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get metrics summary for a tool
|
|
24
|
+
*/
|
|
25
|
+
getToolStats(toolName, timeWindowMs) {
|
|
26
|
+
const now = Date.now();
|
|
27
|
+
const window = timeWindowMs || Infinity;
|
|
28
|
+
const relevant = this.metrics.filter((m) => m.toolName === toolName && now - m.timestamp < window);
|
|
29
|
+
if (relevant.length === 0) {
|
|
30
|
+
return {
|
|
31
|
+
count: 0,
|
|
32
|
+
successCount: 0,
|
|
33
|
+
errorCount: 0,
|
|
34
|
+
avgDurationMs: 0,
|
|
35
|
+
minDurationMs: 0,
|
|
36
|
+
maxDurationMs: 0,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const successCount = relevant.filter((m) => m.success).length;
|
|
40
|
+
const durations = relevant.map((m) => m.durationMs);
|
|
41
|
+
const sum = durations.reduce((a, b) => a + b, 0);
|
|
42
|
+
return {
|
|
43
|
+
count: relevant.length,
|
|
44
|
+
successCount,
|
|
45
|
+
errorCount: relevant.length - successCount,
|
|
46
|
+
avgDurationMs: sum / relevant.length,
|
|
47
|
+
minDurationMs: Math.min(...durations),
|
|
48
|
+
maxDurationMs: Math.max(...durations),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get all tool names
|
|
53
|
+
*/
|
|
54
|
+
getToolNames() {
|
|
55
|
+
return Array.from(new Set(this.metrics.map((m) => m.toolName)));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get overall stats
|
|
59
|
+
*/
|
|
60
|
+
getOverallStats(timeWindowMs) {
|
|
61
|
+
const now = Date.now();
|
|
62
|
+
const window = timeWindowMs || Infinity;
|
|
63
|
+
const relevant = this.metrics.filter((m) => now - m.timestamp < window);
|
|
64
|
+
if (relevant.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
totalRequests: 0,
|
|
67
|
+
successRate: 0,
|
|
68
|
+
avgDurationMs: 0,
|
|
69
|
+
toolStats: {},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const successCount = relevant.filter((m) => m.success).length;
|
|
73
|
+
const durations = relevant.map((m) => m.durationMs);
|
|
74
|
+
const sum = durations.reduce((a, b) => a + b, 0);
|
|
75
|
+
const toolStats = {};
|
|
76
|
+
for (const toolName of this.getToolNames()) {
|
|
77
|
+
toolStats[toolName] = this.getToolStats(toolName, timeWindowMs);
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
totalRequests: relevant.length,
|
|
81
|
+
successRate: successCount / relevant.length,
|
|
82
|
+
avgDurationMs: sum / relevant.length,
|
|
83
|
+
toolStats,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Clear all metrics
|
|
88
|
+
*/
|
|
89
|
+
clear() {
|
|
90
|
+
this.metrics = [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export const metricsCollector = new MetricsCollector();
|
|
94
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/utils/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a correlation ID for request tracing
|
|
3
|
+
*/
|
|
4
|
+
export declare function generateCorrelationId(): string;
|
|
5
|
+
/**
|
|
6
|
+
* Formats API response for better LLM understanding
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatResponse(data: unknown, metadata?: {
|
|
9
|
+
toolName?: string;
|
|
10
|
+
correlationId?: string;
|
|
11
|
+
executionTimeMs?: number;
|
|
12
|
+
timestamp?: string;
|
|
13
|
+
}): {
|
|
14
|
+
content: Array<{
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Formats balance response for better readability
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatBalanceResponse(data: unknown, metadata?: {
|
|
23
|
+
correlationId?: string;
|
|
24
|
+
executionTimeMs?: number;
|
|
25
|
+
}): {
|
|
26
|
+
content: Array<{
|
|
27
|
+
type: "text";
|
|
28
|
+
text: string;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Formats ticker response for better readability
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatTickerResponse(data: unknown, metadata?: {
|
|
35
|
+
correlationId?: string;
|
|
36
|
+
executionTimeMs?: number;
|
|
37
|
+
}): {
|
|
38
|
+
content: Array<{
|
|
39
|
+
type: "text";
|
|
40
|
+
text: string;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Formats order response for better readability
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatOrderResponse(data: unknown, metadata?: {
|
|
47
|
+
correlationId?: string;
|
|
48
|
+
executionTimeMs?: number;
|
|
49
|
+
}): {
|
|
50
|
+
content: Array<{
|
|
51
|
+
type: "text";
|
|
52
|
+
text: string;
|
|
53
|
+
}>;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Formats order book response for better readability
|
|
57
|
+
*/
|
|
58
|
+
export declare function formatOrderBookResponse(data: unknown, metadata?: {
|
|
59
|
+
toolName?: string;
|
|
60
|
+
correlationId?: string;
|
|
61
|
+
executionTimeMs?: number;
|
|
62
|
+
}): {
|
|
63
|
+
content: Array<{
|
|
64
|
+
type: "text";
|
|
65
|
+
text: string;
|
|
66
|
+
}>;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Formats trades response for better readability
|
|
70
|
+
*/
|
|
71
|
+
export declare function formatTradesResponse(data: unknown, metadata?: {
|
|
72
|
+
toolName?: string;
|
|
73
|
+
correlationId?: string;
|
|
74
|
+
executionTimeMs?: number;
|
|
75
|
+
}): {
|
|
76
|
+
content: Array<{
|
|
77
|
+
type: "text";
|
|
78
|
+
text: string;
|
|
79
|
+
}>;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Formats klines/candlestick response for better readability
|
|
83
|
+
*/
|
|
84
|
+
export declare function formatKlinesResponse(data: unknown, metadata?: {
|
|
85
|
+
toolName?: string;
|
|
86
|
+
correlationId?: string;
|
|
87
|
+
executionTimeMs?: number;
|
|
88
|
+
}): {
|
|
89
|
+
content: Array<{
|
|
90
|
+
type: "text";
|
|
91
|
+
text: string;
|
|
92
|
+
}>;
|
|
93
|
+
};
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Response formatting utilities for better LLM parsing and understanding.
|
|
3
|
+
*/
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
/**
|
|
6
|
+
* Generates a correlation ID for request tracing
|
|
7
|
+
*/
|
|
8
|
+
export function generateCorrelationId() {
|
|
9
|
+
return randomUUID();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Formats API response for better LLM understanding
|
|
13
|
+
*/
|
|
14
|
+
export function formatResponse(data, metadata) {
|
|
15
|
+
const timestamp = metadata?.timestamp || new Date().toISOString();
|
|
16
|
+
const response = {
|
|
17
|
+
data,
|
|
18
|
+
...(metadata?.correlationId && { correlationId: metadata.correlationId }),
|
|
19
|
+
...(metadata?.executionTimeMs !== undefined && { executionTimeMs: metadata.executionTimeMs }),
|
|
20
|
+
timestamp,
|
|
21
|
+
};
|
|
22
|
+
// Format response text with metadata
|
|
23
|
+
let text = JSON.stringify(data, null, 2);
|
|
24
|
+
// Add metadata as comments for LLM context
|
|
25
|
+
if (metadata?.correlationId || metadata?.executionTimeMs !== undefined) {
|
|
26
|
+
const metadataLines = [];
|
|
27
|
+
if (metadata.correlationId) {
|
|
28
|
+
metadataLines.push(`// Request ID: ${metadata.correlationId}`);
|
|
29
|
+
}
|
|
30
|
+
if (metadata.executionTimeMs !== undefined) {
|
|
31
|
+
metadataLines.push(`// Execution time: ${metadata.executionTimeMs}ms`);
|
|
32
|
+
}
|
|
33
|
+
if (metadata.toolName) {
|
|
34
|
+
metadataLines.push(`// Tool: ${metadata.toolName}`);
|
|
35
|
+
}
|
|
36
|
+
text = metadataLines.join("\n") + "\n" + text;
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: "text",
|
|
42
|
+
text,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Formats balance response for better readability
|
|
49
|
+
*/
|
|
50
|
+
export function formatBalanceResponse(data, metadata) {
|
|
51
|
+
const response = formatResponse(data, metadata);
|
|
52
|
+
// If data is a balance response, add a summary
|
|
53
|
+
if (data && typeof data === "object") {
|
|
54
|
+
const obj = data;
|
|
55
|
+
if (obj.balances || obj.currencies) {
|
|
56
|
+
let summary = "## Balance Summary\n\n";
|
|
57
|
+
if (Array.isArray(obj.balances)) {
|
|
58
|
+
summary += "Available balances:\n";
|
|
59
|
+
for (const balance of obj.balances) {
|
|
60
|
+
if (balance && typeof balance === "object") {
|
|
61
|
+
const bal = balance;
|
|
62
|
+
const currency = bal.currency || bal.asset || "Unknown";
|
|
63
|
+
const available = bal.available || bal.free || "0";
|
|
64
|
+
const locked = bal.locked || "0";
|
|
65
|
+
summary += `- ${currency}: ${available} available${locked !== "0" ? `, ${locked} locked` : ""}\n`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (obj.currencies && typeof obj.currencies === "object") {
|
|
70
|
+
summary += "Available balances:\n";
|
|
71
|
+
for (const [currency, balance] of Object.entries(obj.currencies)) {
|
|
72
|
+
if (balance && typeof balance === "object") {
|
|
73
|
+
const bal = balance;
|
|
74
|
+
const available = bal.available || bal.free || "0";
|
|
75
|
+
const locked = bal.locked || "0";
|
|
76
|
+
summary += `- ${currency}: ${available} available${locked !== "0" ? `, ${locked} locked` : ""}\n`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
summary += "\n---\n\n";
|
|
81
|
+
response.content[0].text = summary + response.content[0].text;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return response;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Formats ticker response for better readability
|
|
88
|
+
*/
|
|
89
|
+
export function formatTickerResponse(data, metadata) {
|
|
90
|
+
const response = formatResponse(data, metadata);
|
|
91
|
+
// If data is a ticker response, add a summary
|
|
92
|
+
if (data && typeof data === "object") {
|
|
93
|
+
const obj = data;
|
|
94
|
+
if (obj.lastPrice || obj.price) {
|
|
95
|
+
let summary = "## Price Information\n\n";
|
|
96
|
+
const symbol = obj.symbol || "Unknown";
|
|
97
|
+
const price = obj.lastPrice || obj.price || "N/A";
|
|
98
|
+
const change24h = obj.priceChange24h || obj.change24h;
|
|
99
|
+
const changePercent24h = obj.priceChangePercent24h || obj.changePercent24h;
|
|
100
|
+
summary += `**Symbol:** ${symbol}\n`;
|
|
101
|
+
summary += `**Current Price:** ${price}\n`;
|
|
102
|
+
if (change24h) {
|
|
103
|
+
summary += `**24h Change:** ${change24h}`;
|
|
104
|
+
if (changePercent24h) {
|
|
105
|
+
summary += ` (${changePercent24h}%)`;
|
|
106
|
+
}
|
|
107
|
+
summary += "\n";
|
|
108
|
+
}
|
|
109
|
+
if (obj.volume24h) {
|
|
110
|
+
summary += `**24h Volume:** ${obj.volume24h}\n`;
|
|
111
|
+
}
|
|
112
|
+
summary += "\n---\n\n";
|
|
113
|
+
response.content[0].text = summary + response.content[0].text;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return response;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Formats order response for better readability
|
|
120
|
+
*/
|
|
121
|
+
export function formatOrderResponse(data, metadata) {
|
|
122
|
+
const response = formatResponse(data, metadata);
|
|
123
|
+
// If data is an order response, add a summary
|
|
124
|
+
if (data && typeof data === "object") {
|
|
125
|
+
const obj = data;
|
|
126
|
+
if (obj.orderId || obj.clientOrderId || obj.symbol) {
|
|
127
|
+
let summary = "## Order Status\n\n";
|
|
128
|
+
if (obj.orderId)
|
|
129
|
+
summary += `**Order ID:** ${obj.orderId}\n`;
|
|
130
|
+
if (obj.clientOrderId)
|
|
131
|
+
summary += `**Client Order ID:** ${obj.clientOrderId}\n`;
|
|
132
|
+
if (obj.symbol)
|
|
133
|
+
summary += `**Symbol:** ${obj.symbol}\n`;
|
|
134
|
+
if (obj.side)
|
|
135
|
+
summary += `**Side:** ${obj.side}\n`;
|
|
136
|
+
if (obj.status)
|
|
137
|
+
summary += `**Status:** ${obj.status}\n`;
|
|
138
|
+
if (obj.executedPrice)
|
|
139
|
+
summary += `**Executed Price:** ${obj.executedPrice}\n`;
|
|
140
|
+
if (obj.executedQuantity)
|
|
141
|
+
summary += `**Executed Quantity:** ${obj.executedQuantity}\n`;
|
|
142
|
+
summary += "\n---\n\n";
|
|
143
|
+
response.content[0].text = summary + response.content[0].text;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return response;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Formats order book response for better readability
|
|
150
|
+
*/
|
|
151
|
+
export function formatOrderBookResponse(data, metadata) {
|
|
152
|
+
const response = formatResponse(data, metadata);
|
|
153
|
+
if (data && typeof data === "object") {
|
|
154
|
+
const obj = data;
|
|
155
|
+
if (obj.bids || obj.asks || obj.symbol) {
|
|
156
|
+
let summary = "## Order Book Summary\n\n";
|
|
157
|
+
if (obj.symbol)
|
|
158
|
+
summary += `**Symbol:** ${obj.symbol}\n`;
|
|
159
|
+
if (Array.isArray(obj.bids) && obj.bids.length > 0) {
|
|
160
|
+
const bestBid = obj.bids[0];
|
|
161
|
+
if (bestBid && typeof bestBid === "object") {
|
|
162
|
+
const bid = bestBid;
|
|
163
|
+
summary += `**Best Bid:** ${bid[0] || bid.price || "N/A"} (Quantity: ${bid[1] || bid.quantity || "N/A"})\n`;
|
|
164
|
+
}
|
|
165
|
+
summary += `**Total Bids:** ${obj.bids.length} price levels\n`;
|
|
166
|
+
}
|
|
167
|
+
if (Array.isArray(obj.asks) && obj.asks.length > 0) {
|
|
168
|
+
const bestAsk = obj.asks[0];
|
|
169
|
+
if (bestAsk && typeof bestAsk === "object") {
|
|
170
|
+
const ask = bestAsk;
|
|
171
|
+
summary += `**Best Ask:** ${ask[0] || ask.price || "N/A"} (Quantity: ${ask[1] || ask.quantity || "N/A"})\n`;
|
|
172
|
+
}
|
|
173
|
+
summary += `**Total Asks:** ${obj.asks.length} price levels\n`;
|
|
174
|
+
}
|
|
175
|
+
if (obj.spread) {
|
|
176
|
+
summary += `**Spread:** ${obj.spread}\n`;
|
|
177
|
+
}
|
|
178
|
+
summary += "\n---\n\n";
|
|
179
|
+
response.content[0].text = summary + response.content[0].text;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return response;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Formats trades response for better readability
|
|
186
|
+
*/
|
|
187
|
+
export function formatTradesResponse(data, metadata) {
|
|
188
|
+
const response = formatResponse(data, metadata);
|
|
189
|
+
if (data && typeof data === "object") {
|
|
190
|
+
const obj = data;
|
|
191
|
+
if (Array.isArray(obj.trades) || Array.isArray(obj.data)) {
|
|
192
|
+
const trades = (obj.trades || obj.data);
|
|
193
|
+
let summary = "## Recent Trades Summary\n\n";
|
|
194
|
+
if (obj.symbol)
|
|
195
|
+
summary += `**Symbol:** ${obj.symbol}\n`;
|
|
196
|
+
summary += `**Total Trades:** ${trades.length}\n\n`;
|
|
197
|
+
if (trades.length > 0) {
|
|
198
|
+
summary += "**Recent Activity:**\n";
|
|
199
|
+
const displayCount = Math.min(5, trades.length);
|
|
200
|
+
for (let i = 0; i < displayCount; i++) {
|
|
201
|
+
const trade = trades[i];
|
|
202
|
+
if (trade && typeof trade === "object") {
|
|
203
|
+
const t = trade;
|
|
204
|
+
const price = t.price || t[0] || "N/A";
|
|
205
|
+
const quantity = t.quantity || t.qty || t[1] || "N/A";
|
|
206
|
+
const side = t.side || (t[2] === "buy" ? "BUY" : t[2] === "sell" ? "SELL" : "N/A");
|
|
207
|
+
const time = t.time || t.timestamp || t[3] || "N/A";
|
|
208
|
+
summary += `${i + 1}. ${side} ${quantity} @ ${price} (Time: ${time})\n`;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (trades.length > displayCount) {
|
|
212
|
+
summary += `... and ${trades.length - displayCount} more trades\n`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
summary += "\n---\n\n";
|
|
216
|
+
response.content[0].text = summary + response.content[0].text;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return response;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Formats klines/candlestick response for better readability
|
|
223
|
+
*/
|
|
224
|
+
export function formatKlinesResponse(data, metadata) {
|
|
225
|
+
const response = formatResponse(data, metadata);
|
|
226
|
+
if (data && typeof data === "object") {
|
|
227
|
+
const obj = data;
|
|
228
|
+
if (Array.isArray(obj.klines) || Array.isArray(obj.data) || Array.isArray(obj)) {
|
|
229
|
+
const klines = (obj.klines || obj.data || obj);
|
|
230
|
+
let summary = "## Candlestick Data Summary\n\n";
|
|
231
|
+
if (obj.symbol)
|
|
232
|
+
summary += `**Symbol:** ${obj.symbol}\n`;
|
|
233
|
+
if (obj.interval)
|
|
234
|
+
summary += `**Interval:** ${obj.interval}\n`;
|
|
235
|
+
summary += `**Total Candles:** ${klines.length}\n\n`;
|
|
236
|
+
if (klines.length > 0) {
|
|
237
|
+
summary += "**Price Range:**\n";
|
|
238
|
+
// Extract OHLC from first and last candles
|
|
239
|
+
const firstCandle = klines[0];
|
|
240
|
+
const lastCandle = klines[klines.length - 1];
|
|
241
|
+
if (Array.isArray(firstCandle) && firstCandle.length >= 4) {
|
|
242
|
+
summary += `- **Open (First):** ${firstCandle[0]}\n`;
|
|
243
|
+
summary += `- **High (First):** ${firstCandle[1]}\n`;
|
|
244
|
+
summary += `- **Low (First):** ${firstCandle[2]}\n`;
|
|
245
|
+
summary += `- **Close (First):** ${firstCandle[3]}\n`;
|
|
246
|
+
}
|
|
247
|
+
if (Array.isArray(lastCandle) && lastCandle.length >= 4) {
|
|
248
|
+
summary += `- **Close (Last):** ${lastCandle[3]}\n`;
|
|
249
|
+
}
|
|
250
|
+
// Calculate price change if possible
|
|
251
|
+
if (Array.isArray(firstCandle) && Array.isArray(lastCandle) &&
|
|
252
|
+
firstCandle.length >= 4 && lastCandle.length >= 4) {
|
|
253
|
+
const openPrice = parseFloat(String(firstCandle[0]));
|
|
254
|
+
const closePrice = parseFloat(String(lastCandle[3]));
|
|
255
|
+
if (!isNaN(openPrice) && !isNaN(closePrice)) {
|
|
256
|
+
const change = closePrice - openPrice;
|
|
257
|
+
const changePercent = ((change / openPrice) * 100).toFixed(2);
|
|
258
|
+
summary += `- **Price Change:** ${change >= 0 ? "+" : ""}${change} (${changePercent}%)\n`;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
summary += "\n---\n\n";
|
|
263
|
+
response.content[0].text = summary + response.content[0].text;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return response;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=responseFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseFormatter.js","sourceRoot":"","sources":["../../src/utils/responseFormatter.ts"],"names":[],"mappings":"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"}
|