@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 @@
|
|
|
1
|
+
{"version":3,"file":"validation.test.js","sourceRoot":"","sources":["../../src/__tests__/validation.test.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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(/ /g, " ")
|
|
51
|
+
.replace(/&/g, "&")
|
|
52
|
+
.replace(/</g, "<")
|
|
53
|
+
.replace(/>/g, ">")
|
|
54
|
+
.replace(/"/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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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;
|