@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,172 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Core ZebpayAPI encapsulates signing, sending, and error normalization.
|
|
3
|
+
*/
|
|
4
|
+
import { buildAuthHeaders, buildQueryStringAuthHeaders, signQueryString, signPayloadString, signRequest } from "../security/signing.js";
|
|
5
|
+
import { HttpError } from "../http/httpClient.js";
|
|
6
|
+
import { convertHttpErrorToMcpError, createInternalError } from "../mcp/errors.js";
|
|
7
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
export class ZebpayAPI {
|
|
9
|
+
constructor(config, creds, http) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.creds = creds;
|
|
12
|
+
this.http = http;
|
|
13
|
+
}
|
|
14
|
+
baseUrl(useFutures) {
|
|
15
|
+
return useFutures ? this.config.futuresBaseUrl : this.config.spotBaseUrl;
|
|
16
|
+
}
|
|
17
|
+
buildUrl(useFutures, path, queryParams) {
|
|
18
|
+
const trimmed = path.startsWith("/") ? path : `/${path}`;
|
|
19
|
+
let url = `${this.baseUrl(useFutures)}${trimmed}`;
|
|
20
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
21
|
+
const queryString = Object.entries(queryParams)
|
|
22
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
23
|
+
.join("&");
|
|
24
|
+
url += `?${queryString}`;
|
|
25
|
+
// Debug logging
|
|
26
|
+
if (this.config.logLevel === "debug") {
|
|
27
|
+
console.error(JSON.stringify({
|
|
28
|
+
level: "debug",
|
|
29
|
+
msg: "buildUrl details",
|
|
30
|
+
queryParams,
|
|
31
|
+
queryString,
|
|
32
|
+
finalUrl: url
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return url;
|
|
37
|
+
}
|
|
38
|
+
async request({ method, path, body, useFutures = false, queryParams: providedQueryParams }) {
|
|
39
|
+
const apiKey = this.creds.getApiKey();
|
|
40
|
+
const secret = this.creds.getSecretKey();
|
|
41
|
+
const methodUpper = method.toUpperCase();
|
|
42
|
+
const isGetOrDelete = methodUpper === "GET" || methodUpper === "DELETE";
|
|
43
|
+
const isPost = methodUpper === "POST";
|
|
44
|
+
const includeBody = isPost && body !== undefined && body !== null;
|
|
45
|
+
let url;
|
|
46
|
+
let authHeaders;
|
|
47
|
+
let finalBody = body;
|
|
48
|
+
if (isGetOrDelete) {
|
|
49
|
+
// For GET and DELETE requests, use query-string based signing (Zebpay API format)
|
|
50
|
+
const timestamp = Date.now().toString();
|
|
51
|
+
const queryParams = {
|
|
52
|
+
timestamp,
|
|
53
|
+
...providedQueryParams, // Merge provided query params with timestamp
|
|
54
|
+
};
|
|
55
|
+
// Build query string for signing (sorted alphabetically for consistent signing)
|
|
56
|
+
// This same sorted order must be used in the URL to match the signature
|
|
57
|
+
const sortedEntries = Object.entries(queryParams)
|
|
58
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
59
|
+
const queryString = sortedEntries
|
|
60
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
61
|
+
.join("&");
|
|
62
|
+
// Sign the query string
|
|
63
|
+
const signature = signQueryString(queryString, secret);
|
|
64
|
+
// Build auth headers (only API key and signature, no timestamp header)
|
|
65
|
+
authHeaders = buildQueryStringAuthHeaders(apiKey, signature, this.config.signingHeaders);
|
|
66
|
+
// Build URL with the same sorted query string to match the signature
|
|
67
|
+
const trimmed = path.startsWith("/") ? path : `/${path}`;
|
|
68
|
+
url = `${this.baseUrl(useFutures)}${trimmed}?${queryString}`;
|
|
69
|
+
// Debug logging
|
|
70
|
+
if (this.config.logLevel === "debug") {
|
|
71
|
+
console.error(JSON.stringify({
|
|
72
|
+
level: "debug",
|
|
73
|
+
msg: `${methodUpper} request details`,
|
|
74
|
+
path,
|
|
75
|
+
queryString,
|
|
76
|
+
timestamp,
|
|
77
|
+
url,
|
|
78
|
+
hasQueryParams: url.includes("?")
|
|
79
|
+
}));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else if (isPost) {
|
|
83
|
+
// For POST requests, sign the JSON body directly (Zebpay API format)
|
|
84
|
+
const timestamp = Date.now();
|
|
85
|
+
// Prepare payload with timestamp added
|
|
86
|
+
const payload = body ? { ...body, timestamp } : { timestamp };
|
|
87
|
+
// Stringify the payload (deterministic JSON stringify)
|
|
88
|
+
const payloadString = JSON.stringify(payload);
|
|
89
|
+
// Sign the payload string directly
|
|
90
|
+
const signature = signPayloadString(payloadString, secret);
|
|
91
|
+
// Build auth headers (only API key and signature, no timestamp header)
|
|
92
|
+
authHeaders = buildQueryStringAuthHeaders(apiKey, signature, this.config.signingHeaders);
|
|
93
|
+
// Set the final body with timestamp included
|
|
94
|
+
finalBody = payload;
|
|
95
|
+
url = this.buildUrl(useFutures, path);
|
|
96
|
+
// Debug logging
|
|
97
|
+
if (this.config.logLevel === "debug") {
|
|
98
|
+
console.error(JSON.stringify({
|
|
99
|
+
level: "debug",
|
|
100
|
+
msg: "POST request details",
|
|
101
|
+
path,
|
|
102
|
+
payloadString,
|
|
103
|
+
timestamp,
|
|
104
|
+
signature
|
|
105
|
+
}));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// For other methods (PUT, PATCH, etc.), fall back to original signing method
|
|
110
|
+
const signature = signRequest(method, path, includeBody ? body : undefined, secret, {
|
|
111
|
+
headers: this.config.signingHeaders,
|
|
112
|
+
includeBody,
|
|
113
|
+
});
|
|
114
|
+
authHeaders = buildAuthHeaders(apiKey, signature, this.config.signingHeaders);
|
|
115
|
+
url = this.buildUrl(useFutures, path);
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const res = await this.http.request({
|
|
119
|
+
method,
|
|
120
|
+
url,
|
|
121
|
+
headers: authHeaders,
|
|
122
|
+
body: isPost ? finalBody : (isGetOrDelete ? undefined : body),
|
|
123
|
+
timeoutMs: this.config.timeoutMs,
|
|
124
|
+
retryCount: this.config.retryCount,
|
|
125
|
+
});
|
|
126
|
+
return res.data;
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
if (err instanceof HttpError) {
|
|
130
|
+
// Extract error message from various possible response formats
|
|
131
|
+
let errorMessage = err.message || "Unknown API error";
|
|
132
|
+
// Extract error message and preserve full details for better error handling
|
|
133
|
+
let errorDetails = err.details;
|
|
134
|
+
if (err.details) {
|
|
135
|
+
if (typeof err.details === "string") {
|
|
136
|
+
errorMessage = err.details;
|
|
137
|
+
}
|
|
138
|
+
else if (typeof err.details === "object") {
|
|
139
|
+
// Check common error response fields (in order of preference)
|
|
140
|
+
const details = err.details;
|
|
141
|
+
// Extract statusDescription first (most specific)
|
|
142
|
+
if (typeof details.statusDescription === "string" && details.statusDescription) {
|
|
143
|
+
errorMessage = details.statusDescription;
|
|
144
|
+
}
|
|
145
|
+
else if (typeof details.error === "string" && details.error) {
|
|
146
|
+
errorMessage = details.error;
|
|
147
|
+
}
|
|
148
|
+
else if (typeof details.message === "string" && details.message) {
|
|
149
|
+
errorMessage = details.message;
|
|
150
|
+
}
|
|
151
|
+
else if (typeof details.msg === "string" && details.msg) {
|
|
152
|
+
errorMessage = details.msg;
|
|
153
|
+
}
|
|
154
|
+
else if (typeof details.errorMessage === "string" && details.errorMessage) {
|
|
155
|
+
errorMessage = details.errorMessage;
|
|
156
|
+
}
|
|
157
|
+
// Preserve the full details object for error conversion
|
|
158
|
+
errorDetails = details;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
throw convertHttpErrorToMcpError(err.status, errorMessage, errorDetails, err.isHtmlResponse);
|
|
162
|
+
}
|
|
163
|
+
// Re-throw MCP errors as-is
|
|
164
|
+
if (err instanceof McpError) {
|
|
165
|
+
throw err;
|
|
166
|
+
}
|
|
167
|
+
// Wrap other errors as internal errors
|
|
168
|
+
throw createInternalError(err instanceof Error ? err.message : String(err), { originalError: String(err) });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=ZebpayAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZebpayAPI.js","sourceRoot":"","sources":["../../src/private/ZebpayAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { HttpClient } from "../http/httpClient.js";
|
|
2
|
+
import { AppConfig } from "../config.js";
|
|
3
|
+
export interface TickerParams {
|
|
4
|
+
symbol: string;
|
|
5
|
+
}
|
|
6
|
+
export interface OrderBookParams {
|
|
7
|
+
symbol: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface OrderBookTickerParams {
|
|
11
|
+
symbol: string;
|
|
12
|
+
}
|
|
13
|
+
export interface TradesParams {
|
|
14
|
+
symbol: string;
|
|
15
|
+
limit?: number;
|
|
16
|
+
page?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface KlineParams {
|
|
19
|
+
symbol: string;
|
|
20
|
+
interval: string;
|
|
21
|
+
startTime: number;
|
|
22
|
+
endTime: number;
|
|
23
|
+
limit?: number;
|
|
24
|
+
category?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface MarketTickerParams {
|
|
27
|
+
symbol: string;
|
|
28
|
+
group?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface MarketBookParams {
|
|
31
|
+
symbol: string;
|
|
32
|
+
converted?: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class PublicClient {
|
|
35
|
+
private readonly config;
|
|
36
|
+
private readonly http;
|
|
37
|
+
constructor(config: AppConfig, http: HttpClient);
|
|
38
|
+
private buildUrl;
|
|
39
|
+
private buildMarketUrl;
|
|
40
|
+
/**
|
|
41
|
+
* Helper method to handle HTTP requests with consistent error handling
|
|
42
|
+
*/
|
|
43
|
+
private handleRequest;
|
|
44
|
+
/**
|
|
45
|
+
* Get all tickers from Zebpay API.
|
|
46
|
+
* Endpoint: GET /api/v2/market/allTickers
|
|
47
|
+
*/
|
|
48
|
+
getAllTickers(): Promise<unknown>;
|
|
49
|
+
/**
|
|
50
|
+
* Get ticker for a specific symbol from Zebpay API.
|
|
51
|
+
* Endpoint: GET /api/v2/market/ticker?symbol={symbol}
|
|
52
|
+
*/
|
|
53
|
+
getTicker(params: TickerParams): Promise<unknown>;
|
|
54
|
+
getOrderBook(params: OrderBookParams): Promise<unknown>;
|
|
55
|
+
/**
|
|
56
|
+
* Get order book ticker for a specific symbol from Zebpay API.
|
|
57
|
+
* Endpoint: GET /api/v2/market/orderbook/ticker?symbol={symbol}
|
|
58
|
+
*/
|
|
59
|
+
getOrderBookTicker(params: OrderBookTickerParams): Promise<unknown>;
|
|
60
|
+
getTrades(params: TradesParams): Promise<unknown>;
|
|
61
|
+
getKlines(params: KlineParams): Promise<unknown>;
|
|
62
|
+
getExchangeInfo(): Promise<unknown>;
|
|
63
|
+
getCurrencies(): Promise<unknown>;
|
|
64
|
+
/**
|
|
65
|
+
* Get market information from Zebpay market API.
|
|
66
|
+
* Endpoint: GET /api/v1/market
|
|
67
|
+
*/
|
|
68
|
+
getMarket(): Promise<unknown>;
|
|
69
|
+
/**
|
|
70
|
+
* Get ticker for a specific symbol from Zebpay market API.
|
|
71
|
+
* Endpoint: GET /api/v1/market/{symbol}/ticker
|
|
72
|
+
*/
|
|
73
|
+
getMarketTicker(params: MarketTickerParams): Promise<unknown>;
|
|
74
|
+
/**
|
|
75
|
+
* Get order book for a specific symbol from Zebpay market API.
|
|
76
|
+
* Endpoint: GET /api/v1/market/{symbol}/book
|
|
77
|
+
*/
|
|
78
|
+
getMarketBook(params: MarketBookParams): Promise<unknown>;
|
|
79
|
+
}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Public client for market data and public endpoints (no authentication required).
|
|
3
|
+
*/
|
|
4
|
+
import { HttpError } from "../http/httpClient.js";
|
|
5
|
+
import { tickerCache, orderBookCache, exchangeInfoCache, currenciesCache } from "../utils/cache.js";
|
|
6
|
+
import { convertHttpErrorToMcpError } from "../mcp/errors.js";
|
|
7
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
export class PublicClient {
|
|
9
|
+
constructor(config, http) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.http = http;
|
|
12
|
+
}
|
|
13
|
+
buildUrl(path, queryParams) {
|
|
14
|
+
const trimmed = path.startsWith("/") ? path : `/${path}`;
|
|
15
|
+
let url = `${this.config.spotBaseUrl}${trimmed}`;
|
|
16
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
17
|
+
const queryString = Object.entries(queryParams)
|
|
18
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
19
|
+
.join("&");
|
|
20
|
+
url += `?${queryString}`;
|
|
21
|
+
}
|
|
22
|
+
return url;
|
|
23
|
+
}
|
|
24
|
+
buildMarketUrl(path, queryParams) {
|
|
25
|
+
// Market API uses configurable base URL from config
|
|
26
|
+
const trimmed = path.startsWith("/") ? path : `/${path}`;
|
|
27
|
+
let url = `${this.config.marketBaseUrl}${trimmed}`;
|
|
28
|
+
if (queryParams && Object.keys(queryParams).length > 0) {
|
|
29
|
+
const queryString = Object.entries(queryParams)
|
|
30
|
+
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
|
|
31
|
+
.join("&");
|
|
32
|
+
url += `?${queryString}`;
|
|
33
|
+
}
|
|
34
|
+
return url;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Helper method to handle HTTP requests with consistent error handling
|
|
38
|
+
*/
|
|
39
|
+
async handleRequest(requestFn) {
|
|
40
|
+
try {
|
|
41
|
+
const response = await requestFn();
|
|
42
|
+
return response.data;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
if (err instanceof HttpError) {
|
|
46
|
+
// Extract error message from various possible response formats
|
|
47
|
+
let errorMessage = err.message || "Unknown API error";
|
|
48
|
+
if (err.details) {
|
|
49
|
+
if (typeof err.details === "string") {
|
|
50
|
+
errorMessage = err.details;
|
|
51
|
+
}
|
|
52
|
+
else if (typeof err.details === "object") {
|
|
53
|
+
// Check common error response fields (in order of preference)
|
|
54
|
+
const details = err.details;
|
|
55
|
+
errorMessage =
|
|
56
|
+
(typeof details.statusDescription === "string" && details.statusDescription) ||
|
|
57
|
+
(typeof details.error === "string" && details.error) ||
|
|
58
|
+
(typeof details.message === "string" && details.message) ||
|
|
59
|
+
(typeof details.msg === "string" && details.msg) ||
|
|
60
|
+
(typeof details.errorMessage === "string" && details.errorMessage) ||
|
|
61
|
+
errorMessage;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw convertHttpErrorToMcpError(err.status, errorMessage, err.details);
|
|
65
|
+
}
|
|
66
|
+
// Re-throw MCP errors as-is
|
|
67
|
+
if (err instanceof McpError) {
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
// Re-throw other errors
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get all tickers from Zebpay API.
|
|
76
|
+
* Endpoint: GET /api/v2/market/allTickers
|
|
77
|
+
*/
|
|
78
|
+
async getAllTickers() {
|
|
79
|
+
const cacheKey = "allTickers";
|
|
80
|
+
const cached = tickerCache.get(cacheKey);
|
|
81
|
+
if (cached) {
|
|
82
|
+
return cached;
|
|
83
|
+
}
|
|
84
|
+
const path = "/market/allTickers";
|
|
85
|
+
const url = this.buildUrl(path);
|
|
86
|
+
const data = await this.handleRequest(() => this.http.request({
|
|
87
|
+
method: "GET",
|
|
88
|
+
url,
|
|
89
|
+
timeoutMs: this.config.timeoutMs,
|
|
90
|
+
retryCount: this.config.retryCount,
|
|
91
|
+
}));
|
|
92
|
+
tickerCache.set(cacheKey, data);
|
|
93
|
+
return data;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get ticker for a specific symbol from Zebpay API.
|
|
97
|
+
* Endpoint: GET /api/v2/market/ticker?symbol={symbol}
|
|
98
|
+
*/
|
|
99
|
+
async getTicker(params) {
|
|
100
|
+
const cacheKey = `ticker:${params.symbol}`;
|
|
101
|
+
const cached = tickerCache.get(cacheKey);
|
|
102
|
+
if (cached) {
|
|
103
|
+
return cached;
|
|
104
|
+
}
|
|
105
|
+
const path = "/market/ticker";
|
|
106
|
+
const queryParams = {
|
|
107
|
+
symbol: params.symbol,
|
|
108
|
+
};
|
|
109
|
+
const url = this.buildUrl(path, queryParams);
|
|
110
|
+
const data = await this.handleRequest(() => this.http.request({
|
|
111
|
+
method: "GET",
|
|
112
|
+
url,
|
|
113
|
+
timeoutMs: this.config.timeoutMs,
|
|
114
|
+
retryCount: this.config.retryCount,
|
|
115
|
+
}));
|
|
116
|
+
tickerCache.set(cacheKey, data);
|
|
117
|
+
return data;
|
|
118
|
+
}
|
|
119
|
+
async getOrderBook(params) {
|
|
120
|
+
const cacheKey = `orderbook:${params.symbol}:${params.limit || "default"}`;
|
|
121
|
+
const cached = orderBookCache.get(cacheKey);
|
|
122
|
+
if (cached) {
|
|
123
|
+
return cached;
|
|
124
|
+
}
|
|
125
|
+
const path = "/market/orderbook";
|
|
126
|
+
const queryParams = {
|
|
127
|
+
symbol: params.symbol,
|
|
128
|
+
};
|
|
129
|
+
if (params.limit !== undefined) {
|
|
130
|
+
queryParams.limit = params.limit.toString();
|
|
131
|
+
}
|
|
132
|
+
const url = this.buildUrl(path, queryParams);
|
|
133
|
+
const data = await this.handleRequest(() => this.http.request({
|
|
134
|
+
method: "GET",
|
|
135
|
+
url,
|
|
136
|
+
timeoutMs: this.config.timeoutMs,
|
|
137
|
+
retryCount: this.config.retryCount,
|
|
138
|
+
}));
|
|
139
|
+
orderBookCache.set(cacheKey, data);
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get order book ticker for a specific symbol from Zebpay API.
|
|
144
|
+
* Endpoint: GET /api/v2/market/orderbook/ticker?symbol={symbol}
|
|
145
|
+
*/
|
|
146
|
+
async getOrderBookTicker(params) {
|
|
147
|
+
const path = "/market/orderbook/ticker";
|
|
148
|
+
const queryParams = {
|
|
149
|
+
symbol: params.symbol,
|
|
150
|
+
};
|
|
151
|
+
const url = this.buildUrl(path, queryParams);
|
|
152
|
+
return this.handleRequest(() => this.http.request({
|
|
153
|
+
method: "GET",
|
|
154
|
+
url,
|
|
155
|
+
timeoutMs: this.config.timeoutMs,
|
|
156
|
+
retryCount: this.config.retryCount,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
async getTrades(params) {
|
|
160
|
+
const path = "/market/trades";
|
|
161
|
+
const queryParams = {
|
|
162
|
+
symbol: params.symbol,
|
|
163
|
+
};
|
|
164
|
+
if (params.limit !== undefined) {
|
|
165
|
+
queryParams.limit = params.limit.toString();
|
|
166
|
+
}
|
|
167
|
+
if (params.page !== undefined) {
|
|
168
|
+
queryParams.page = params.page.toString();
|
|
169
|
+
}
|
|
170
|
+
const url = this.buildUrl(path, queryParams);
|
|
171
|
+
return this.handleRequest(() => this.http.request({
|
|
172
|
+
method: "GET",
|
|
173
|
+
url,
|
|
174
|
+
timeoutMs: this.config.timeoutMs,
|
|
175
|
+
retryCount: this.config.retryCount,
|
|
176
|
+
}));
|
|
177
|
+
}
|
|
178
|
+
async getKlines(params) {
|
|
179
|
+
const path = "/market/klines";
|
|
180
|
+
const queryParams = {
|
|
181
|
+
symbol: params.symbol,
|
|
182
|
+
interval: params.interval,
|
|
183
|
+
startTime: params.startTime.toString(),
|
|
184
|
+
endTime: params.endTime.toString(),
|
|
185
|
+
};
|
|
186
|
+
if (params.limit !== undefined) {
|
|
187
|
+
queryParams.limit = params.limit.toString();
|
|
188
|
+
}
|
|
189
|
+
if (params.category !== undefined) {
|
|
190
|
+
queryParams.category = params.category;
|
|
191
|
+
}
|
|
192
|
+
const url = this.buildUrl(path, queryParams);
|
|
193
|
+
return this.handleRequest(() => this.http.request({
|
|
194
|
+
method: "GET",
|
|
195
|
+
url,
|
|
196
|
+
timeoutMs: this.config.timeoutMs,
|
|
197
|
+
retryCount: this.config.retryCount,
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
async getExchangeInfo() {
|
|
201
|
+
const cacheKey = "exchangeInfo";
|
|
202
|
+
const cached = exchangeInfoCache.get(cacheKey);
|
|
203
|
+
if (cached) {
|
|
204
|
+
return cached;
|
|
205
|
+
}
|
|
206
|
+
const path = "/ex/exchangeInfo";
|
|
207
|
+
const url = this.buildUrl(path);
|
|
208
|
+
const data = await this.handleRequest(() => this.http.request({
|
|
209
|
+
method: "GET",
|
|
210
|
+
url,
|
|
211
|
+
timeoutMs: this.config.timeoutMs,
|
|
212
|
+
retryCount: this.config.retryCount,
|
|
213
|
+
}));
|
|
214
|
+
exchangeInfoCache.set(cacheKey, data);
|
|
215
|
+
return data;
|
|
216
|
+
}
|
|
217
|
+
async getCurrencies() {
|
|
218
|
+
const cacheKey = "currencies";
|
|
219
|
+
const cached = currenciesCache.get(cacheKey);
|
|
220
|
+
if (cached) {
|
|
221
|
+
return cached;
|
|
222
|
+
}
|
|
223
|
+
const path = "/ex/currencies";
|
|
224
|
+
const url = this.buildUrl(path);
|
|
225
|
+
const data = await this.handleRequest(() => this.http.request({
|
|
226
|
+
method: "GET",
|
|
227
|
+
url,
|
|
228
|
+
timeoutMs: this.config.timeoutMs,
|
|
229
|
+
retryCount: this.config.retryCount,
|
|
230
|
+
}));
|
|
231
|
+
currenciesCache.set(cacheKey, data);
|
|
232
|
+
return data;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get market information from Zebpay market API.
|
|
236
|
+
* Endpoint: GET /api/v1/market
|
|
237
|
+
*/
|
|
238
|
+
async getMarket() {
|
|
239
|
+
const path = "";
|
|
240
|
+
const url = this.buildMarketUrl(path);
|
|
241
|
+
return this.handleRequest(() => this.http.request({
|
|
242
|
+
method: "GET",
|
|
243
|
+
url,
|
|
244
|
+
timeoutMs: this.config.timeoutMs,
|
|
245
|
+
retryCount: this.config.retryCount,
|
|
246
|
+
}));
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get ticker for a specific symbol from Zebpay market API.
|
|
250
|
+
* Endpoint: GET /api/v1/market/{symbol}/ticker
|
|
251
|
+
*/
|
|
252
|
+
async getMarketTicker(params) {
|
|
253
|
+
const path = `/${params.symbol}/ticker`;
|
|
254
|
+
const queryParams = params.group
|
|
255
|
+
? { group: params.group }
|
|
256
|
+
: undefined;
|
|
257
|
+
const url = this.buildMarketUrl(path, queryParams);
|
|
258
|
+
return this.handleRequest(() => this.http.request({
|
|
259
|
+
method: "GET",
|
|
260
|
+
url,
|
|
261
|
+
timeoutMs: this.config.timeoutMs,
|
|
262
|
+
retryCount: this.config.retryCount,
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get order book for a specific symbol from Zebpay market API.
|
|
267
|
+
* Endpoint: GET /api/v1/market/{symbol}/book
|
|
268
|
+
*/
|
|
269
|
+
async getMarketBook(params) {
|
|
270
|
+
const path = `/${params.symbol}/book`;
|
|
271
|
+
const queryParams = params.converted !== undefined
|
|
272
|
+
? { converted: params.converted.toString() }
|
|
273
|
+
: undefined;
|
|
274
|
+
const url = this.buildMarketUrl(path, queryParams);
|
|
275
|
+
return this.handleRequest(() => this.http.request({
|
|
276
|
+
method: "GET",
|
|
277
|
+
url,
|
|
278
|
+
timeoutMs: this.config.timeoutMs,
|
|
279
|
+
retryCount: this.config.retryCount,
|
|
280
|
+
}));
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=PublicClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicClient.js","sourceRoot":"","sources":["../../src/public/PublicClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { HttpClient } from "../http/httpClient.js";
|
|
2
|
+
import { AppConfig } from "../config.js";
|
|
3
|
+
export interface FuturesSymbolParams {
|
|
4
|
+
symbol: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FuturesOrderBookParams {
|
|
7
|
+
symbol: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class PublicFuturesClient {
|
|
11
|
+
private readonly config;
|
|
12
|
+
private readonly http;
|
|
13
|
+
constructor(config: AppConfig, http: HttpClient);
|
|
14
|
+
private buildUrl;
|
|
15
|
+
private buildRootUrl;
|
|
16
|
+
private handleRequest;
|
|
17
|
+
getHealthCheckStatus(): Promise<unknown>;
|
|
18
|
+
getMarkets(): Promise<unknown>;
|
|
19
|
+
getMarketInfo(): Promise<unknown>;
|
|
20
|
+
getOrderBook(params: FuturesOrderBookParams): Promise<unknown>;
|
|
21
|
+
getTicker24Hr(params: FuturesSymbolParams): Promise<unknown>;
|
|
22
|
+
getAggregateTrades(params: FuturesSymbolParams & {
|
|
23
|
+
limit?: number;
|
|
24
|
+
}): Promise<unknown>;
|
|
25
|
+
getExchangeInfo(): Promise<unknown>;
|
|
26
|
+
getExchangePairs(): Promise<unknown>;
|
|
27
|
+
}
|