kinetic-mcp 1.3.0 → 1.3.2

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.
@@ -5,6 +5,7 @@ let log;
5
5
  const JWT_REFRESH_BUFFER_MS = 5 * 60 * 1000;
6
6
  const MAX_STREAM_EVENTS = 100;
7
7
  let cachedJwt = null;
8
+ let authInFlight = null;
8
9
  export function initApiClient(config, logger) {
9
10
  cfg = config;
10
11
  log = logger;
@@ -32,22 +33,33 @@ async function authenticate() {
32
33
  if (cachedJwt && Date.now() < cachedJwt.expiresAt) {
33
34
  return cachedJwt.token;
34
35
  }
35
- const response = await fetch(`${cfg.authBaseUrl}/v1/token`, {
36
- method: "POST",
37
- headers: { "Content-Type": "application/json" },
38
- body: JSON.stringify({ apiKey: cfg.apiKey }),
39
- signal: AbortSignal.timeout(cfg.requestTimeoutMs),
40
- });
41
- if (!response.ok) {
42
- throw new Error(`Auth failed: ${response.status} ${response.statusText}`);
43
- }
44
- const data = (await response.json());
45
- const ttlMs = data.expiresIn * 1000;
46
- cachedJwt = {
47
- token: data.accessToken,
48
- expiresAt: Date.now() + ttlMs - JWT_REFRESH_BUFFER_MS,
49
- };
50
- return cachedJwt.token;
36
+ // Deduplicate concurrent auth requests — if one is already in flight, reuse it
37
+ if (authInFlight)
38
+ return authInFlight;
39
+ authInFlight = (async () => {
40
+ try {
41
+ const response = await fetch(`${cfg.authBaseUrl}/v1/token`, {
42
+ method: "POST",
43
+ headers: { "Content-Type": "application/json" },
44
+ body: JSON.stringify({ apiKey: cfg.apiKey }),
45
+ signal: AbortSignal.timeout(cfg.requestTimeoutMs),
46
+ });
47
+ if (!response.ok) {
48
+ throw new Error(`Auth failed: ${response.status} ${response.statusText}`);
49
+ }
50
+ const data = (await response.json());
51
+ const ttlMs = data.expiresIn * 1000;
52
+ cachedJwt = {
53
+ token: data.accessToken,
54
+ expiresAt: Date.now() + ttlMs - JWT_REFRESH_BUFFER_MS,
55
+ };
56
+ return cachedJwt.token;
57
+ }
58
+ finally {
59
+ authInFlight = null;
60
+ }
61
+ })();
62
+ return authInFlight;
51
63
  }
52
64
  async function getHeaders() {
53
65
  const headers = {
@@ -97,6 +109,99 @@ async function fetchWithAuthAndRetry(url, options) {
97
109
  }
98
110
  return resp;
99
111
  }
112
+ function logStreamEvent(event) {
113
+ if ("status" in event) {
114
+ log.debug({ status: event.status }, "sendTransaction status");
115
+ }
116
+ else if ("txHash" in event) {
117
+ log.debug({ txHash: event.txHash }, "sendTransaction txHash");
118
+ }
119
+ else if ("error" in event) {
120
+ log.debug({ error: event.error }, "sendTransaction error");
121
+ }
122
+ }
123
+ /** Push a parsed JSON value into the events array, handling both objects and arrays. */
124
+ function pushParsedEvents(parsed, events) {
125
+ if (Array.isArray(parsed)) {
126
+ for (const item of parsed) {
127
+ if (events.length >= MAX_STREAM_EVENTS)
128
+ break;
129
+ events.push(item);
130
+ logStreamEvent(item);
131
+ }
132
+ }
133
+ else {
134
+ events.push(parsed);
135
+ logStreamEvent(parsed);
136
+ }
137
+ }
138
+ /**
139
+ * Parse a response body that may be either NDJSON (one JSON object per line)
140
+ * or a regular JSON array. Handles both formats transparently.
141
+ */
142
+ export async function parseStreamResponse(body) {
143
+ const events = [];
144
+ const reader = body.getReader();
145
+ const decoder = new TextDecoder();
146
+ let buffer = "";
147
+ const rawChunks = [];
148
+ try {
149
+ while (true) {
150
+ const { done, value } = await reader.read();
151
+ if (done)
152
+ break;
153
+ const chunk = decoder.decode(value, { stream: true });
154
+ buffer += chunk;
155
+ rawChunks.push(chunk);
156
+ const lines = buffer.split("\n");
157
+ buffer = lines.pop() || "";
158
+ for (const line of lines) {
159
+ if (events.length >= MAX_STREAM_EVENTS)
160
+ break;
161
+ const trimmed = line.trim();
162
+ if (!trimmed)
163
+ continue;
164
+ try {
165
+ pushParsedEvents(JSON.parse(trimmed), events);
166
+ }
167
+ catch {
168
+ log.debug({ raw: trimmed.slice(0, 200) }, "Skipped non-JSON line in stream");
169
+ }
170
+ }
171
+ if (events.length >= MAX_STREAM_EVENTS) {
172
+ log.warn("Event limit reached, stopping read");
173
+ break;
174
+ }
175
+ }
176
+ // Handle remaining buffer for NDJSON
177
+ if (buffer.trim() && events.length < MAX_STREAM_EVENTS) {
178
+ try {
179
+ pushParsedEvents(JSON.parse(buffer.trim()), events);
180
+ }
181
+ catch {
182
+ // Will try full-body parse below
183
+ }
184
+ }
185
+ // Fallback: if no events were parsed via NDJSON, try parsing the full body as a JSON array.
186
+ // Kinetic sometimes returns a pretty-printed JSON array instead of NDJSON.
187
+ if (events.length === 0 && rawChunks.length > 0) {
188
+ const fullBody = rawChunks.join("").trim();
189
+ if (fullBody) {
190
+ try {
191
+ pushParsedEvents(JSON.parse(fullBody), events);
192
+ log.debug({ count: events.length }, "Parsed response as non-NDJSON format");
193
+ }
194
+ catch (err) {
195
+ log.warn({ err, raw: fullBody.slice(0, 500) }, "Failed to parse sendTransaction response");
196
+ }
197
+ }
198
+ }
199
+ }
200
+ finally {
201
+ reader.releaseLock();
202
+ }
203
+ return events;
204
+ }
100
205
  // --- Public API ---
101
206
  export async function getQuote(req) {
102
207
  const baseUrl = cfg.apiBaseUrl.replace(/\/$/, "");
@@ -160,65 +265,9 @@ export async function sendTransaction(params) {
160
265
  if (!response.ok) {
161
266
  await throwApiError(response, "Kinetic sendTransaction");
162
267
  }
163
- // Parse newline-delimited JSON stream
164
- const events = [];
165
- const body = response.body;
166
- if (!body) {
268
+ if (!response.body) {
167
269
  throw new Error("No response body from sendTransaction.");
168
270
  }
169
- const reader = body.getReader();
170
- const decoder = new TextDecoder();
171
- let buffer = "";
172
- try {
173
- while (true) {
174
- const { done, value } = await reader.read();
175
- if (done)
176
- break;
177
- buffer += decoder.decode(value, { stream: true });
178
- const lines = buffer.split("\n");
179
- buffer = lines.pop() || "";
180
- for (const line of lines) {
181
- if (events.length >= MAX_STREAM_EVENTS)
182
- break;
183
- const trimmed = line.trim();
184
- if (!trimmed)
185
- continue;
186
- try {
187
- const event = JSON.parse(trimmed);
188
- events.push(event);
189
- if ("status" in event) {
190
- log.debug({ status: event.status }, "sendTransaction status");
191
- }
192
- else if ("txHash" in event) {
193
- log.debug({ txHash: event.txHash }, "sendTransaction txHash");
194
- }
195
- else if ("error" in event) {
196
- log.debug({ error: event.error }, "sendTransaction error");
197
- }
198
- }
199
- catch (err) {
200
- log.warn({ err, raw: trimmed.slice(0, 500) }, "Failed to parse NDJSON stream line");
201
- }
202
- }
203
- if (events.length >= MAX_STREAM_EVENTS) {
204
- log.warn("Event limit reached, stopping read");
205
- break;
206
- }
207
- }
208
- // Handle remaining buffer
209
- if (buffer.trim() && events.length < MAX_STREAM_EVENTS) {
210
- try {
211
- const event = JSON.parse(buffer.trim());
212
- events.push(event);
213
- }
214
- catch (err) {
215
- log.warn({ err, raw: buffer.trim().slice(0, 500) }, "Failed to parse NDJSON final buffer");
216
- }
217
- }
218
- }
219
- finally {
220
- reader.releaseLock();
221
- }
222
- return events;
271
+ return parseStreamResponse(response.body);
223
272
  }
224
273
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ import { Connection, Keypair } from "@solana/web3.js";
2
2
  import { readFileSync } from "node:fs";
3
3
  import { homedir } from "node:os";
4
4
  import { resolve } from "node:path";
5
+ const RPC_MAX_RETRIES = 3;
6
+ const RPC_BASE_DELAY_MS = 1000;
5
7
  let cfg;
6
8
  let log;
7
9
  let cachedKeypair = null;
@@ -10,6 +12,26 @@ export function initSolana(config, logger) {
10
12
  cfg = config;
11
13
  log = logger;
12
14
  }
15
+ /**
16
+ * Fetch wrapper that retries 429/503 responses with exponential backoff.
17
+ * Used as the custom `fetch` for Solana RPC Connection to handle rate limits.
18
+ */
19
+ async function rpcFetchWithRetry(input, init) {
20
+ for (let attempt = 0; attempt < RPC_MAX_RETRIES; attempt++) {
21
+ const resp = await fetch(input, init);
22
+ if (resp.status !== 429 && resp.status !== 503) {
23
+ return resp;
24
+ }
25
+ // Drain the response body to release the underlying socket
26
+ await resp.body?.cancel();
27
+ const jitter = Math.random() * RPC_BASE_DELAY_MS;
28
+ const delay = RPC_BASE_DELAY_MS * Math.pow(2, attempt) + jitter;
29
+ log.warn({ status: resp.status, attempt: attempt + 1, delayMs: Math.round(delay) }, "Solana RPC rate limited, retrying");
30
+ await new Promise((r) => setTimeout(r, delay));
31
+ }
32
+ // Final attempt — return whatever we get
33
+ return fetch(input, init);
34
+ }
13
35
  function expandHome(p) {
14
36
  if (p.startsWith("~/") || p.startsWith("~\\")) {
15
37
  return resolve(homedir(), p.slice(2));
@@ -41,7 +63,10 @@ export function loadKeypair(path) {
41
63
  export function getConnection() {
42
64
  if (cachedConnection)
43
65
  return cachedConnection;
44
- cachedConnection = new Connection(cfg.solanaRpcUrl, "confirmed");
66
+ cachedConnection = new Connection(cfg.solanaRpcUrl, {
67
+ commitment: "confirmed",
68
+ fetch: rpcFetchWithRetry,
69
+ });
45
70
  return cachedConnection;
46
71
  }
47
72
  export function getWalletAddress() {
@@ -1 +1 @@
1
- {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/utils/solana.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,IAAI,GAAW,CAAC;AAChB,IAAI,GAAW,CAAC;AAChB,IAAI,aAAa,GAAmB,IAAI,CAAC;AACzC,IAAI,gBAAgB,GAAsB,IAAI,CAAC;AAE/C,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,MAAc;IACvD,GAAG,GAAG,MAAM,CAAC;IACb,GAAG,GAAG,MAAM,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,8BAA8B,CAAC,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,oEAAoE,EAAE;YACpF,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;IACL,CAAC;IAED,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,MAAM,KAAK,EAAE;QACpB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAClE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IACxF,CAAC;IAED,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,gBAAgB;QAAE,OAAO,gBAAgB,CAAC;IAE9C,gBAAgB,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IACjE,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;AACjE,CAAC"}
1
+ {"version":3,"file":"solana.js","sourceRoot":"","sources":["../../src/utils/solana.ts"],"names":[],"mappings":"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"}
@@ -9,9 +9,14 @@ export function initTokenResolver(logger) {
9
9
  function isBase58MintAddress(input) {
10
10
  return /^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(input);
11
11
  }
12
+ const mintDecimalsCache = new Map();
12
13
  async function fetchOnChainDecimals(mint) {
14
+ const cached = mintDecimalsCache.get(mint);
15
+ if (cached !== undefined)
16
+ return cached;
13
17
  try {
14
18
  const mintInfo = await getMint(getConnection(), new PublicKey(mint));
19
+ mintDecimalsCache.set(mint, mintInfo.decimals);
15
20
  return mintInfo.decimals;
16
21
  }
17
22
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"token-resolver.js","sourceRoot":"","sources":["../../src/utils/token-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAGnE,IAAI,GAAW,CAAC;AAEhB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,GAAG,GAAG,MAAM,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,wCAAwC,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,mCAAmC,EACzF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,2CAA2C;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAC/F,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACxE,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,sDAAsD;IACtD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,uHAAuH,CAC/I,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjE,OAAO,SAAS,IAAI,IAAI,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"token-resolver.js","sourceRoot":"","sources":["../../src/utils/token-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAkB,MAAM,gBAAgB,CAAC;AAGnE,IAAI,GAAW,CAAC;AAEhB,MAAM,UAAU,iBAAiB,CAAC,MAAc;IAC9C,GAAG,GAAG,MAAM,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,+BAA+B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEpD,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACrE,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,wCAAwC,CAAC,CAAC;QACnE,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,mCAAmC,EACzF,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,2CAA2C;IAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IAC/F,IAAI,iBAAiB;QAAE,OAAO,iBAAiB,CAAC;IAEhD,MAAM,eAAe,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACxE,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,sDAAsD;IACtD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,uHAAuH,CAC/I,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjE,OAAO,SAAS,IAAI,IAAI,CAAC;AAC3B,CAAC"}
package/package.json CHANGED
@@ -1,53 +1,53 @@
1
- {
2
- "name": "kinetic-mcp",
3
- "version": "1.3.0",
4
- "description": "MCP server for Solana trading via Kinetic API",
5
- "type": "module",
6
- "main": "build/index.js",
7
- "bin": {
8
- "kinetic-mcp": "build/index.js"
9
- },
10
- "files": [
11
- "build/",
12
- "scripts/setup.mjs"
13
- ],
14
- "engines": {
15
- "node": ">=20"
16
- },
17
- "scripts": {
18
- "build": "tsc",
19
- "dev": "tsc --watch",
20
- "start": "node build/index.js",
21
- "clean": "rm -rf build/",
22
- "typecheck": "tsc --noEmit",
23
- "lint": "eslint src/",
24
- "lint:fix": "eslint src/ --fix",
25
- "format": "prettier --write \"src/**/*.ts\"",
26
- "format:check": "prettier --check \"src/**/*.ts\"",
27
- "test": "vitest run",
28
- "test:watch": "vitest",
29
- "setup": "node scripts/setup.mjs"
30
- },
31
- "dependencies": {
32
- "@clack/prompts": "^1.0.1",
33
- "@modelcontextprotocol/sdk": "^1.27.0",
34
- "@solana/spl-token": "^0.4.9",
35
- "@solana/web3.js": "^1.95.0",
36
- "bs58": "^6.0.0",
37
- "gradient-string": "^3.0.0",
38
- "picocolors": "^1.1.1",
39
- "pino": "^10.3.1",
40
- "zod": "^3.23.0"
41
- },
42
- "devDependencies": {
43
- "@eslint/js": "^10.0.1",
44
- "@types/node": "^20.19.35",
45
- "eslint": "^10.0.2",
46
- "eslint-config-prettier": "^10.1.8",
47
- "globals": "^17.3.0",
48
- "prettier": "^3.8.1",
49
- "typescript": "^5.7.0",
50
- "typescript-eslint": "^8.56.1",
51
- "vitest": "^4.0.18"
52
- }
53
- }
1
+ {
2
+ "name": "kinetic-mcp",
3
+ "version": "1.3.2",
4
+ "description": "MCP server for Solana trading via Kinetic API",
5
+ "type": "module",
6
+ "main": "build/index.js",
7
+ "bin": {
8
+ "kinetic-mcp": "build/index.js"
9
+ },
10
+ "files": [
11
+ "build/",
12
+ "scripts/setup.mjs"
13
+ ],
14
+ "engines": {
15
+ "node": ">=20"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "start": "node build/index.js",
21
+ "clean": "rm -rf build/",
22
+ "typecheck": "tsc --noEmit",
23
+ "lint": "eslint src/",
24
+ "lint:fix": "eslint src/ --fix",
25
+ "format": "prettier --write \"src/**/*.ts\"",
26
+ "format:check": "prettier --check \"src/**/*.ts\"",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "setup": "node scripts/setup.mjs"
30
+ },
31
+ "dependencies": {
32
+ "@clack/prompts": "^1.0.1",
33
+ "@modelcontextprotocol/sdk": "^1.27.0",
34
+ "@solana/spl-token": "^0.4.9",
35
+ "@solana/web3.js": "^1.95.0",
36
+ "bs58": "^6.0.0",
37
+ "gradient-string": "^3.0.0",
38
+ "picocolors": "^1.1.1",
39
+ "pino": "^10.3.1",
40
+ "zod": "^3.23.0"
41
+ },
42
+ "devDependencies": {
43
+ "@eslint/js": "^10.0.1",
44
+ "@types/node": "^20.19.35",
45
+ "eslint": "^10.0.2",
46
+ "eslint-config-prettier": "^10.1.8",
47
+ "globals": "^17.3.0",
48
+ "prettier": "^3.8.1",
49
+ "typescript": "^5.7.0",
50
+ "typescript-eslint": "^8.56.1",
51
+ "vitest": "^4.0.18"
52
+ }
53
+ }