@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.

Files changed (120) hide show
  1. package/.env.example +14 -0
  2. package/README.md +223 -0
  3. package/dist/__tests__/errors.test.d.ts +5 -0
  4. package/dist/__tests__/errors.test.js +147 -0
  5. package/dist/__tests__/errors.test.js.map +1 -0
  6. package/dist/__tests__/prompts.test.d.ts +1 -0
  7. package/dist/__tests__/prompts.test.js +73 -0
  8. package/dist/__tests__/prompts.test.js.map +1 -0
  9. package/dist/__tests__/resources.test.d.ts +1 -0
  10. package/dist/__tests__/resources.test.js +79 -0
  11. package/dist/__tests__/resources.test.js.map +1 -0
  12. package/dist/__tests__/validation.test.d.ts +15 -0
  13. package/dist/__tests__/validation.test.js +64 -0
  14. package/dist/__tests__/validation.test.js.map +1 -0
  15. package/dist/config.d.ts +19 -0
  16. package/dist/config.js +81 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/http/httpClient.d.ts +40 -0
  19. package/dist/http/httpClient.js +341 -0
  20. package/dist/http/httpClient.js.map +1 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.js +60 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/mcp/errors.d.ts +21 -0
  25. package/dist/mcp/errors.js +214 -0
  26. package/dist/mcp/errors.js.map +1 -0
  27. package/dist/mcp/logging.d.ts +21 -0
  28. package/dist/mcp/logging.js +241 -0
  29. package/dist/mcp/logging.js.map +1 -0
  30. package/dist/mcp/prompts.d.ts +9 -0
  31. package/dist/mcp/prompts.js +165 -0
  32. package/dist/mcp/prompts.js.map +1 -0
  33. package/dist/mcp/resources.d.ts +9 -0
  34. package/dist/mcp/resources.js +125 -0
  35. package/dist/mcp/resources.js.map +1 -0
  36. package/dist/mcp/tools_futures.d.ts +5 -0
  37. package/dist/mcp/tools_futures.js +694 -0
  38. package/dist/mcp/tools_futures.js.map +1 -0
  39. package/dist/mcp/tools_spot.d.ts +11 -0
  40. package/dist/mcp/tools_spot.js +2225 -0
  41. package/dist/mcp/tools_spot.js.map +1 -0
  42. package/dist/private/FuturesClient.d.ts +57 -0
  43. package/dist/private/FuturesClient.js +181 -0
  44. package/dist/private/FuturesClient.js.map +1 -0
  45. package/dist/private/SpotClient.d.ts +44 -0
  46. package/dist/private/SpotClient.js +201 -0
  47. package/dist/private/SpotClient.js.map +1 -0
  48. package/dist/private/ZebpayAPI.d.ts +19 -0
  49. package/dist/private/ZebpayAPI.js +172 -0
  50. package/dist/private/ZebpayAPI.js.map +1 -0
  51. package/dist/public/PublicClient.d.ts +79 -0
  52. package/dist/public/PublicClient.js +283 -0
  53. package/dist/public/PublicClient.js.map +1 -0
  54. package/dist/public/PublicFuturesClient.d.ts +27 -0
  55. package/dist/public/PublicFuturesClient.js +187 -0
  56. package/dist/public/PublicFuturesClient.js.map +1 -0
  57. package/dist/security/credentials.d.ts +42 -0
  58. package/dist/security/credentials.js +80 -0
  59. package/dist/security/credentials.js.map +1 -0
  60. package/dist/security/signing.d.ts +33 -0
  61. package/dist/security/signing.js +56 -0
  62. package/dist/security/signing.js.map +1 -0
  63. package/dist/types/responses.d.ts +130 -0
  64. package/dist/types/responses.js +6 -0
  65. package/dist/types/responses.js.map +1 -0
  66. package/dist/utils/cache.d.ts +29 -0
  67. package/dist/utils/cache.js +72 -0
  68. package/dist/utils/cache.js.map +1 -0
  69. package/dist/utils/fileLogger.d.ts +10 -0
  70. package/dist/utils/fileLogger.js +81 -0
  71. package/dist/utils/fileLogger.js.map +1 -0
  72. package/dist/utils/metrics.d.ts +35 -0
  73. package/dist/utils/metrics.js +94 -0
  74. package/dist/utils/metrics.js.map +1 -0
  75. package/dist/utils/responseFormatter.d.ts +93 -0
  76. package/dist/utils/responseFormatter.js +268 -0
  77. package/dist/utils/responseFormatter.js.map +1 -0
  78. package/dist/validation/schemas.d.ts +70 -0
  79. package/dist/validation/schemas.js +48 -0
  80. package/dist/validation/schemas.js.map +1 -0
  81. package/dist/validation/validators.d.ts +28 -0
  82. package/dist/validation/validators.js +129 -0
  83. package/dist/validation/validators.js.map +1 -0
  84. package/docs/LOGGING.md +371 -0
  85. package/docs/zebpay-ai-trading-beginner.png +0 -0
  86. package/mcp-config.json.example +20 -0
  87. package/package.json +54 -0
  88. package/scripts/README.md +103 -0
  89. package/scripts/clear-logs.js +52 -0
  90. package/scripts/log-stats.js +264 -0
  91. package/scripts/log-viewer.js +288 -0
  92. package/server.json +31 -0
  93. package/src/__tests__/errors.test.ts +180 -0
  94. package/src/__tests__/prompts.test.ts +89 -0
  95. package/src/__tests__/resources.test.ts +95 -0
  96. package/src/__tests__/validation.test.ts +88 -0
  97. package/src/config.ts +108 -0
  98. package/src/http/httpClient.ts +398 -0
  99. package/src/index.ts +71 -0
  100. package/src/mcp/errors.ts +262 -0
  101. package/src/mcp/logging.ts +284 -0
  102. package/src/mcp/prompts.ts +206 -0
  103. package/src/mcp/resources.ts +163 -0
  104. package/src/mcp/tools_futures.ts +874 -0
  105. package/src/mcp/tools_spot.ts +2702 -0
  106. package/src/private/FuturesClient.ts +189 -0
  107. package/src/private/SpotClient.ts +250 -0
  108. package/src/private/ZebpayAPI.ts +205 -0
  109. package/src/public/PublicClient.ts +381 -0
  110. package/src/public/PublicFuturesClient.ts +228 -0
  111. package/src/security/credentials.ts +114 -0
  112. package/src/security/signing.ts +98 -0
  113. package/src/types/responses.ts +146 -0
  114. package/src/utils/cache.ts +90 -0
  115. package/src/utils/fileLogger.ts +88 -0
  116. package/src/utils/metrics.ts +135 -0
  117. package/src/utils/responseFormatter.ts +361 -0
  118. package/src/validation/schemas.ts +66 -0
  119. package/src/validation/validators.ts +189 -0
  120. package/tsconfig.json +21 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type TransportKind = "stdio";
2
+ export interface SigningHeaderNames {
3
+ apiKeyHeader: string;
4
+ signatureHeader: string;
5
+ timestampHeader: string;
6
+ }
7
+ export interface AppConfig {
8
+ spotBaseUrl: string;
9
+ futuresBaseUrl: string;
10
+ marketBaseUrl: string;
11
+ transports: TransportKind[];
12
+ logLevel: "debug" | "info" | "warn" | "error";
13
+ logFile?: string;
14
+ signingHeaders: SigningHeaderNames;
15
+ timeoutMs: number;
16
+ retryCount: number;
17
+ }
18
+ export declare function redact(value: string | undefined | null, show?: number): string;
19
+ export declare function getConfig(): AppConfig;
package/dist/config.js ADDED
@@ -0,0 +1,81 @@
1
+ /*
2
+ Centralized configuration loading and validation.
3
+ Secrets are never logged; use redact() when including values in logs.
4
+ */
5
+ const SIGNING_HEADERS = {
6
+ apiKeyHeader: "X-AUTH-APIKEY",
7
+ signatureHeader: "X-AUTH-SIGNATURE",
8
+ timestampHeader: "",
9
+ };
10
+ export function redact(value, show = 4) {
11
+ if (!value)
12
+ return "<redacted>";
13
+ if (value.length <= show)
14
+ return "*".repeat(value.length);
15
+ return `${value.slice(0, show)}${"*".repeat(Math.max(4, value.length - show))}`;
16
+ }
17
+ function getRequiredEnv(name) {
18
+ const value = process.env[name];
19
+ if (value === undefined) {
20
+ throw new Error(`Missing required environment variable: ${name}`);
21
+ }
22
+ return value;
23
+ }
24
+ function parseTransports(input) {
25
+ const raw = (input ?? "stdio").split(",").map((s) => s.trim()).filter(Boolean);
26
+ const valid = [];
27
+ for (const t of raw) {
28
+ if (t === "stdio")
29
+ valid.push(t);
30
+ }
31
+ if (!valid.length) {
32
+ throw new Error('Invalid MCP_TRANSPORTS. Only "stdio" is supported.');
33
+ }
34
+ return valid;
35
+ }
36
+ function parseLogLevel(input) {
37
+ if (input === undefined)
38
+ return "info";
39
+ if (input === "debug" || input === "info" || input === "warn" || input === "error") {
40
+ return input;
41
+ }
42
+ throw new Error('Invalid LOG_LEVEL. Use one of: "debug", "info", "warn", "error".');
43
+ }
44
+ export function getConfig() {
45
+ const spotBaseUrl = getRequiredEnv("ZEBPAY_SPOT_BASE_URL");
46
+ const futuresBaseUrl = getRequiredEnv("ZEBPAY_FUTURES_BASE_URL");
47
+ const marketBaseUrl = getRequiredEnv("ZEBPAY_MARKET_BASE_URL");
48
+ const transports = parseTransports(process.env.MCP_TRANSPORTS);
49
+ const logLevel = parseLogLevel(process.env.LOG_LEVEL);
50
+ const logFile = process.env.LOG_FILE; // Optional log file path
51
+ const timeoutMs = Number(process.env.HTTP_TIMEOUT_MS ?? 15000);
52
+ const retryCount = Number(process.env.HTTP_RETRY_COUNT ?? 2);
53
+ const signingHeaders = SIGNING_HEADERS;
54
+ if (!spotBaseUrl.startsWith("http")) {
55
+ throw new Error("Invalid spot base URL");
56
+ }
57
+ if (!futuresBaseUrl.startsWith("http")) {
58
+ throw new Error("Invalid futures base URL");
59
+ }
60
+ if (!marketBaseUrl.startsWith("http")) {
61
+ throw new Error("Invalid market base URL");
62
+ }
63
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
64
+ throw new Error("Invalid HTTP_TIMEOUT_MS");
65
+ }
66
+ if (!Number.isFinite(retryCount) || retryCount < 0) {
67
+ throw new Error("Invalid HTTP_RETRY_COUNT");
68
+ }
69
+ return {
70
+ spotBaseUrl,
71
+ futuresBaseUrl,
72
+ marketBaseUrl,
73
+ transports,
74
+ logLevel,
75
+ logFile,
76
+ signingHeaders,
77
+ timeoutMs,
78
+ retryCount,
79
+ };
80
+ }
81
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface HttpRequestOptions {
2
+ method: string;
3
+ url: string;
4
+ headers?: Record<string, string>;
5
+ body?: unknown;
6
+ timeoutMs: number;
7
+ retryCount: number;
8
+ }
9
+ export interface HttpResponse<T = unknown> {
10
+ status: number;
11
+ headers: Record<string, string>;
12
+ data: T;
13
+ }
14
+ export declare class HttpError extends Error {
15
+ readonly status: number;
16
+ readonly details?: unknown;
17
+ readonly isHtmlResponse?: boolean;
18
+ constructor(message: string, status: number, details?: unknown, isHtmlResponse?: boolean);
19
+ }
20
+ export declare class HttpClient {
21
+ private readonly logLevel;
22
+ constructor(logLevel?: "debug" | "info" | "warn" | "error");
23
+ request<T = unknown>(opts: HttpRequestOptions): Promise<HttpResponse<T>>;
24
+ /**
25
+ * Sanitizes stack traces by removing file paths, keeping only function names and line numbers
26
+ */
27
+ private sanitizeStack;
28
+ /**
29
+ * Formats response body to be more user-readable
30
+ */
31
+ private formatResponseBody;
32
+ /**
33
+ * Sanitizes headers to redact sensitive information
34
+ */
35
+ private sanitizeHeaders;
36
+ /**
37
+ * Sanitizes body to prevent logging huge payloads
38
+ */
39
+ private sanitizeBody;
40
+ }
@@ -0,0 +1,341 @@
1
+ /*
2
+ Minimal HTTP client with retries, timeout, structured errors, and redacted logs.
3
+ */
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { redact } from "../config.js";
6
+ import { fetch } from "undici";
7
+ import { fileLogger } from "../utils/fileLogger.js";
8
+ export class HttpError extends Error {
9
+ constructor(message, status, details, isHtmlResponse) {
10
+ super(message);
11
+ this.status = status;
12
+ this.details = details;
13
+ this.isHtmlResponse = isHtmlResponse;
14
+ }
15
+ }
16
+ /**
17
+ * Parses HTML error pages (like Cloudflare) to extract user-friendly error messages.
18
+ *
19
+ * NOTE: This is transport-agnostic - it parses responses from Zebpay API (external),
20
+ * not from MCP clients. Works identically for both stdio and HTTP transports.
21
+ */
22
+ function parseHtmlError(html) {
23
+ if (!html || typeof html !== "string") {
24
+ return null;
25
+ }
26
+ // Check if it's HTML
27
+ if (!html.trim().toLowerCase().startsWith("<!doctype") && !html.trim().toLowerCase().startsWith("<html")) {
28
+ return null;
29
+ }
30
+ // Extract Cloudflare error messages
31
+ const cloudflarePatterns = [
32
+ // Cloudflare Error 1006 - Access denied
33
+ /<h2[^>]*>Access denied<\/h2>/i,
34
+ /The owner of this website.*?has banned your IP address[^<]*/i,
35
+ /<p[^>]*>The owner of this website[^<]*<\/p>/i,
36
+ // Cloudflare Error 1020 - Access denied
37
+ /<h1[^>]*>Error[^<]*<\/h1>/i,
38
+ // Generic error extraction from title
39
+ /<title>([^<]+)<\/title>/i,
40
+ // Extract error messages from h1/h2 tags
41
+ /<h[12][^>]*>([^<]+)<\/h[12]>/i,
42
+ ];
43
+ for (const pattern of cloudflarePatterns) {
44
+ const match = html.match(pattern);
45
+ if (match) {
46
+ let message = match[1] || match[0];
47
+ // Clean up HTML entities and tags
48
+ message = message
49
+ .replace(/<[^>]+>/g, "")
50
+ .replace(/&nbsp;/g, " ")
51
+ .replace(/&amp;/g, "&")
52
+ .replace(/&lt;/g, "<")
53
+ .replace(/&gt;/g, ">")
54
+ .replace(/&quot;/g, '"')
55
+ .replace(/\s+/g, " ")
56
+ .trim();
57
+ if (message && message.length > 10) {
58
+ // Check for IP ban message
59
+ if (html.includes("banned your IP address")) {
60
+ const ipMatch = html.match(/IP address[^<]*\(([^)]+)\)/i);
61
+ if (ipMatch) {
62
+ return `Access denied: Your IP address has been banned by the website. Please contact support or try again later.`;
63
+ }
64
+ return `Access denied: Your IP address has been restricted. Please contact support or try again later.`;
65
+ }
66
+ // Check for Cloudflare error codes
67
+ const errorCodeMatch = html.match(/Error\s*(\d+)/i);
68
+ if (errorCodeMatch) {
69
+ const errorCode = errorCodeMatch[1];
70
+ if (errorCode === "1006") {
71
+ return `Access denied (Error 1006): Your IP address has been banned. Please contact support or try again later.`;
72
+ }
73
+ return `Cloudflare error (${errorCode}): ${message}`;
74
+ }
75
+ return message;
76
+ }
77
+ }
78
+ }
79
+ // Fallback: try to extract any meaningful text
80
+ const textMatch = html.match(/<body[^>]*>([\s\S]{100,500})<\/body>/i);
81
+ if (textMatch) {
82
+ let text = textMatch[1]
83
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "")
84
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "")
85
+ .replace(/<[^>]+>/g, " ")
86
+ .replace(/\s+/g, " ")
87
+ .trim();
88
+ if (text.length > 20 && text.length < 200) {
89
+ return text;
90
+ }
91
+ }
92
+ return null;
93
+ }
94
+ export class HttpClient {
95
+ constructor(logLevel = "info") {
96
+ this.logLevel = logLevel;
97
+ }
98
+ async request(opts) {
99
+ const { method, url, headers = {}, body, timeoutMs, retryCount } = opts;
100
+ const isIdempotent = method.toUpperCase() === "GET";
101
+ const maxAttempts = isIdempotent ? retryCount + 1 : 1;
102
+ const payload = body === undefined || body === null ? undefined : (typeof body === "string" ? body : JSON.stringify(body));
103
+ // Prepare headers for request (with content-type)
104
+ const requestHeaders = {
105
+ ...headers,
106
+ };
107
+ if (payload) {
108
+ requestHeaders["content-type"] = "application/json";
109
+ }
110
+ // Log HTTP request
111
+ const requestTimestamp = new Date().toISOString();
112
+ const requestLogMessage = JSON.stringify({
113
+ level: "info",
114
+ type: "http_request",
115
+ timestamp: requestTimestamp,
116
+ method: method.toUpperCase(),
117
+ url,
118
+ headers: this.sanitizeHeaders(requestHeaders),
119
+ body: this.sanitizeBody(payload),
120
+ });
121
+ fileLogger.log(requestLogMessage);
122
+ let attempt = 0;
123
+ let lastError;
124
+ while (attempt < maxAttempts) {
125
+ attempt++;
126
+ const controller = new AbortController();
127
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
128
+ const attemptStartTime = Date.now();
129
+ try {
130
+ const res = await fetch(url, {
131
+ method,
132
+ headers: requestHeaders,
133
+ body: payload,
134
+ signal: controller.signal,
135
+ });
136
+ clearTimeout(timer);
137
+ const text = await res.text();
138
+ const contentType = res.headers.get("content-type") || "";
139
+ const isHtml = contentType.includes("text/html") || text.trim().toLowerCase().startsWith("<!doctype") || text.trim().toLowerCase().startsWith("<html");
140
+ let data = undefined;
141
+ let parsedError = null;
142
+ if (isHtml && !res.ok) {
143
+ // Try to parse HTML error page
144
+ parsedError = parseHtmlError(text);
145
+ data = text; // Keep original HTML for logging
146
+ }
147
+ else {
148
+ // Try to parse as JSON
149
+ try {
150
+ data = text ? JSON.parse(text) : undefined;
151
+ }
152
+ catch {
153
+ data = text;
154
+ }
155
+ }
156
+ const response = {
157
+ status: res.status,
158
+ headers: Object.fromEntries(res.headers.entries()),
159
+ data,
160
+ };
161
+ const durationMs = Date.now() - attemptStartTime;
162
+ // Log HTTP response with user-readable format
163
+ const responseTimestamp = new Date().toISOString();
164
+ const responseBody = this.formatResponseBody(data, res.status);
165
+ const responseLogMessage = JSON.stringify({
166
+ level: res.ok ? "info" : "warn",
167
+ type: "http_response",
168
+ timestamp: responseTimestamp,
169
+ method: method.toUpperCase(),
170
+ url,
171
+ status: res.status,
172
+ headers: this.sanitizeHeaders(response.headers),
173
+ body: responseBody,
174
+ durationMs,
175
+ attempt,
176
+ isHtmlResponse: isHtml,
177
+ });
178
+ fileLogger.log(responseLogMessage);
179
+ if (res.ok) {
180
+ return response;
181
+ }
182
+ // Retry on 429/5xx when idempotent
183
+ if (isIdempotent && (res.status === 429 || (res.status >= 500 && res.status < 600)) && attempt < maxAttempts) {
184
+ const retryAfter = Number(response.headers["retry-after"] || 0);
185
+ const backoffMs = retryAfter > 0 ? retryAfter * 1000 : 250 * attempt;
186
+ await delay(backoffMs);
187
+ continue;
188
+ }
189
+ // Use parsed error message if available, otherwise use default
190
+ const errorMessage = parsedError || `HTTP ${res.status}`;
191
+ throw new HttpError(errorMessage, res.status, data, isHtml);
192
+ }
193
+ catch (err) {
194
+ clearTimeout(timer);
195
+ lastError = err;
196
+ const durationMs = Date.now() - attemptStartTime;
197
+ // AbortError or network error
198
+ if (attempt >= maxAttempts) {
199
+ // Log HTTP error
200
+ const errorTimestamp = new Date().toISOString();
201
+ const errorMessage = err instanceof Error ? err.message : String(err);
202
+ const errorStack = err instanceof Error ? err.stack : undefined;
203
+ const errorLogMessage = JSON.stringify({
204
+ level: "error",
205
+ type: "http_error",
206
+ timestamp: errorTimestamp,
207
+ method: method.toUpperCase(),
208
+ url,
209
+ headers: this.sanitizeHeaders(requestHeaders),
210
+ body: this.sanitizeBody(payload),
211
+ durationMs,
212
+ attempt,
213
+ error: errorMessage,
214
+ stack: this.sanitizeStack(errorStack),
215
+ });
216
+ fileLogger.log(errorLogMessage);
217
+ if (err instanceof HttpError)
218
+ throw err;
219
+ throw new HttpError(err.message || "Network error", 0);
220
+ }
221
+ await delay(200 * attempt);
222
+ }
223
+ }
224
+ throw lastError instanceof Error ? lastError : new Error("Unknown HTTP error");
225
+ }
226
+ /**
227
+ * Sanitizes stack traces by removing file paths, keeping only function names and line numbers
228
+ */
229
+ sanitizeStack(stack) {
230
+ if (!stack)
231
+ return undefined;
232
+ try {
233
+ // Remove file:// URLs and absolute paths, keep only filename and line numbers
234
+ const lines = stack.split('\n');
235
+ const sanitizedLines = lines.map(line => {
236
+ let sanitized = line;
237
+ // Remove file:// URLs (e.g., file:///Users/path/to/file.js:123:45)
238
+ sanitized = sanitized.replace(/file:\/\/\/[^\s\)]+/g, (match) => {
239
+ // Extract just the filename and line numbers
240
+ const filenameMatch = match.match(/([^\/]+\.(js|ts|mjs|cjs)):(\d+):(\d+)/);
241
+ if (filenameMatch) {
242
+ return `${filenameMatch[1]}:${filenameMatch[3]}:${filenameMatch[4]}`;
243
+ }
244
+ return '';
245
+ });
246
+ // Remove absolute paths (e.g., /Users/path/to/file.js:123:45)
247
+ sanitized = sanitized.replace(/\/(?:[^\/\s]+\/)+([^\/\s]+\.(js|ts|mjs|cjs)):(\d+):(\d+)/g, '$1:$3:$4');
248
+ // Simplify node_modules paths (e.g., node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js)
249
+ sanitized = sanitized.replace(/node_modules\/([^\/\s]+)\/[^\s\)]+/g, 'node_modules/$1');
250
+ return sanitized.trim();
251
+ });
252
+ return sanitizedLines.join('\n');
253
+ }
254
+ catch {
255
+ // If sanitization fails, return a minimal version without paths
256
+ return stack.split('\n').slice(0, 3).join('\n'); // Keep only first 3 lines
257
+ }
258
+ }
259
+ /**
260
+ * Formats response body to be more user-readable
261
+ */
262
+ formatResponseBody(body, status) {
263
+ if (body === undefined || body === null) {
264
+ return body;
265
+ }
266
+ // For error responses, extract meaningful information
267
+ if (status >= 400 && typeof body === "object" && body !== null) {
268
+ const bodyObj = body;
269
+ const formatted = {};
270
+ // Extract common error fields
271
+ if (typeof bodyObj.statusCode === "number") {
272
+ formatted.statusCode = bodyObj.statusCode;
273
+ }
274
+ if (typeof bodyObj.statusDescription === "string") {
275
+ formatted.statusDescription = bodyObj.statusDescription;
276
+ }
277
+ if (typeof bodyObj.error === "string") {
278
+ formatted.error = bodyObj.error;
279
+ }
280
+ if (typeof bodyObj.message === "string") {
281
+ formatted.message = bodyObj.message;
282
+ }
283
+ // Include data if present
284
+ if (bodyObj.data !== undefined) {
285
+ formatted.data = bodyObj.data;
286
+ }
287
+ // If we extracted meaningful fields, return formatted version
288
+ if (Object.keys(formatted).length > 0) {
289
+ return formatted;
290
+ }
291
+ }
292
+ // For non-error responses or if formatting didn't extract anything, use sanitized body
293
+ return this.sanitizeBody(body);
294
+ }
295
+ /**
296
+ * Sanitizes headers to redact sensitive information
297
+ */
298
+ sanitizeHeaders(headers) {
299
+ const sanitized = {};
300
+ const sensitiveKeys = ["key", "sign", "secret", "password", "token", "authorization", "auth"];
301
+ for (const [key, value] of Object.entries(headers)) {
302
+ if (value === undefined)
303
+ continue;
304
+ const lowerKey = key.toLowerCase();
305
+ if (sensitiveKeys.some((sk) => lowerKey.includes(sk))) {
306
+ sanitized[key] = redact(value);
307
+ }
308
+ else {
309
+ sanitized[key] = value;
310
+ }
311
+ }
312
+ return sanitized;
313
+ }
314
+ /**
315
+ * Sanitizes body to prevent logging huge payloads
316
+ */
317
+ sanitizeBody(body) {
318
+ if (body === undefined || body === null) {
319
+ return body;
320
+ }
321
+ // If body is a string, check size
322
+ if (typeof body === "string") {
323
+ if (body.length > 5000) {
324
+ return body.substring(0, 5000) + "... [truncated]";
325
+ }
326
+ return body;
327
+ }
328
+ // If body is an object, stringify and check size
329
+ try {
330
+ const jsonStr = JSON.stringify(body);
331
+ if (jsonStr.length > 5000) {
332
+ return JSON.parse(jsonStr.substring(0, 5000) + '..."}');
333
+ }
334
+ return body;
335
+ }
336
+ catch {
337
+ return body;
338
+ }
339
+ }
340
+ }
341
+ //# sourceMappingURL=httpClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpClient.js","sourceRoot":"","sources":["../../src/http/httpClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ import { config as dotenvConfig } from "dotenv";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { getConfig } from "./config.js";
5
+ import { EnvCredentialsProvider } from "./security/credentials.js";
6
+ import { HttpClient } from "./http/httpClient.js";
7
+ import { ZebpayAPI } from "./private/ZebpayAPI.js";
8
+ import { SpotClient } from "./private/SpotClient.js";
9
+ import { FuturesClient } from "./private/FuturesClient.js";
10
+ import { PublicClient } from "./public/PublicClient.js";
11
+ import { PublicFuturesClient } from "./public/PublicFuturesClient.js";
12
+ import { registerSpotTools } from "./mcp/tools_spot.js";
13
+ import { registerFuturesTools } from "./mcp/tools_futures.js";
14
+ import { registerResources } from "./mcp/resources.js";
15
+ import { registerPrompts } from "./mcp/prompts.js";
16
+ import { fileLogger } from "./utils/fileLogger.js";
17
+ dotenvConfig();
18
+ function createServer() {
19
+ return new McpServer({
20
+ name: "zebpay",
21
+ version: "1.0.0",
22
+ }, {
23
+ capabilities: {
24
+ tools: {},
25
+ logging: {},
26
+ resources: {},
27
+ prompts: {},
28
+ },
29
+ });
30
+ }
31
+ async function main() {
32
+ const cfg = getConfig();
33
+ if (cfg.logFile) {
34
+ await fileLogger.initialize(cfg.logFile);
35
+ }
36
+ const creds = new EnvCredentialsProvider();
37
+ const http = new HttpClient(cfg.logLevel);
38
+ const api = new ZebpayAPI(cfg, creds, http);
39
+ const spot = new SpotClient(api);
40
+ const futuresPrivateClient = new FuturesClient(api);
41
+ const publicClient = new PublicClient(cfg, http);
42
+ const futuresPublicClient = new PublicFuturesClient(cfg, http);
43
+ const mcp = createServer();
44
+ registerSpotTools(mcp, spot, publicClient, cfg);
45
+ registerFuturesTools(mcp, futuresPublicClient, futuresPrivateClient, cfg);
46
+ registerResources(mcp, publicClient, spot, cfg);
47
+ registerPrompts(mcp, spot, publicClient, cfg);
48
+ const transport = new StdioServerTransport();
49
+ await mcp.connect(transport);
50
+ process.on("SIGINT", async () => {
51
+ await fileLogger.close();
52
+ process.exit(0);
53
+ });
54
+ }
55
+ main().catch(async (error) => {
56
+ console.error("FATAL: Failed to start Zebpay MCP stdio server", error);
57
+ await fileLogger.close();
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ /**
3
+ * Creates an MCP error for invalid parameters with helpful messages
4
+ */
5
+ export declare function createInvalidParamsError(message: string, data?: unknown): McpError;
6
+ /**
7
+ * Creates an MCP error for internal/server errors
8
+ */
9
+ export declare function createInternalError(message: string, data?: unknown): McpError;
10
+ /**
11
+ * Converts HTTP errors to appropriate MCP errors.
12
+ *
13
+ * NOTE: This is transport-agnostic - converts errors from Zebpay API (external)
14
+ * to MCP-compliant errors. Works identically for both stdio and HTTP transports.
15
+ *
16
+ * @param status HTTP status code from Zebpay API
17
+ * @param message Error message (may be HTML if from Cloudflare)
18
+ * @param details Additional error details
19
+ * @param isHtmlResponse Whether the response was HTML (for Cloudflare errors)
20
+ */
21
+ export declare function convertHttpErrorToMcpError(status: number, message: string, details?: unknown, isHtmlResponse?: boolean): McpError;