@insightsentry/mcp 1.4.38 → 1.4.40

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.
@@ -0,0 +1,482 @@
1
+ import { WebSocket } from "ws";
2
+ import { isBrokenPipeError } from "./stream-output.js";
3
+ import { classifyServerError, } from "./websocket-contract.js";
4
+ const DEFAULT_OPEN_TIMEOUT_MS = 10_000;
5
+ const DEFAULT_ACTIVATION_TIMEOUT_MS = 5 * 60_000;
6
+ const DEFAULT_CLOSE_TIMEOUT_MS = 5_000;
7
+ const DEFAULT_STABLE_AFTER_MS = 60_000;
8
+ const DEFAULT_BASE_RECONNECT_DELAY_MS = 500;
9
+ const DEFAULT_MAX_RECONNECT_DELAY_MS = 30_000;
10
+ const DEFAULT_MAX_RECONNECT_ATTEMPTS = 10;
11
+ const MAX_HANDSHAKE_ERROR_BYTES = 64 * 1024;
12
+ export async function runWebSocketStream(options) {
13
+ const diagnostics = options.diagnostics ?? ((message) => process.stderr.write(`${message}\n`));
14
+ const maxReconnectAttempts = options.maxReconnectAttempts ?? DEFAULT_MAX_RECONNECT_ATTEMPTS;
15
+ const stableAfterMs = options.stableAfterMs ?? DEFAULT_STABLE_AFTER_MS;
16
+ const baseDelayMs = options.baseReconnectDelayMs ?? DEFAULT_BASE_RECONNECT_DELAY_MS;
17
+ const maxDelayMs = options.maxReconnectDelayMs ?? DEFAULT_MAX_RECONNECT_DELAY_MS;
18
+ const random = options.random ?? Math.random;
19
+ const durationController = new AbortController();
20
+ const durationTimer = options.durationMs === undefined
21
+ ? undefined
22
+ : setTimeout(() => durationController.abort(), options.durationMs);
23
+ let dataMessages = 0;
24
+ const outputFailureController = new AbortController();
25
+ let outputFailure;
26
+ void options.output.failure.then((error) => {
27
+ outputFailure = error;
28
+ outputFailureController.abort();
29
+ });
30
+ const connectionOptions = {
31
+ request: options.request,
32
+ output: options.output,
33
+ diagnostics,
34
+ signal: options.signal,
35
+ durationSignal: durationController.signal,
36
+ outputFailureSignal: outputFailureController.signal,
37
+ getOutputFailure: () => outputFailure,
38
+ maxReconnectAttempts,
39
+ openTimeoutMs: options.openTimeoutMs ?? DEFAULT_OPEN_TIMEOUT_MS,
40
+ activationTimeoutMs: options.activationTimeoutMs ?? DEFAULT_ACTIVATION_TIMEOUT_MS,
41
+ closeTimeoutMs: options.closeTimeoutMs ?? DEFAULT_CLOSE_TIMEOUT_MS,
42
+ retryDelay: (attempt, serverDelayMs) => Math.max(serverDelayMs, equalJitterDelay(attempt, baseDelayMs, maxDelayMs, random)),
43
+ recordDataMessage: (message) => {
44
+ if (!isDataMessage(message, options.request.endpoint))
45
+ return false;
46
+ dataMessages += 1;
47
+ return options.maxMessages !== undefined && dataMessages >= options.maxMessages;
48
+ },
49
+ };
50
+ let result = { exitCode: 1, reason: "retry_exhausted" };
51
+ let consecutiveReconnects = 0;
52
+ try {
53
+ while (true) {
54
+ if (outputFailure) {
55
+ result = outputFailureResult(outputFailure, diagnostics);
56
+ break;
57
+ }
58
+ if (options.signal?.aborted) {
59
+ result = { exitCode: 0, reason: "aborted" };
60
+ break;
61
+ }
62
+ if (durationController.signal.aborted) {
63
+ result = { exitCode: 0, reason: "duration_reached" };
64
+ break;
65
+ }
66
+ const outcome = await connectOnce(connectionOptions);
67
+ if (outcome.kind !== "reconnect") {
68
+ result = outcomeToResult(outcome);
69
+ break;
70
+ }
71
+ if (outputFailure) {
72
+ result = outputFailureResult(outputFailure, diagnostics);
73
+ break;
74
+ }
75
+ if (outcome.activeForMs >= stableAfterMs) {
76
+ consecutiveReconnects = 0;
77
+ }
78
+ consecutiveReconnects += 1;
79
+ if (consecutiveReconnects > maxReconnectAttempts) {
80
+ diagnostics(`WebSocket reconnect limit reached after ${maxReconnectAttempts} consecutive attempts.`);
81
+ result = { exitCode: 1, reason: "retry_exhausted" };
82
+ break;
83
+ }
84
+ const delayMs = Math.max(outcome.delayMs, equalJitterDelay(consecutiveReconnects, baseDelayMs, maxDelayMs, random));
85
+ diagnostics(`WebSocket disconnected; reconnecting in ${formatDelay(delayMs)} (attempt ${consecutiveReconnects}/${maxReconnectAttempts}).`);
86
+ const completed = await abortableDelay(delayMs, [
87
+ options.signal,
88
+ durationController.signal,
89
+ outputFailureController.signal,
90
+ ]);
91
+ if (!completed) {
92
+ result = outputFailure
93
+ ? outputFailureResult(outputFailure, diagnostics)
94
+ : durationController.signal.aborted
95
+ ? { exitCode: 0, reason: "duration_reached" }
96
+ : { exitCode: 0, reason: "aborted" };
97
+ break;
98
+ }
99
+ }
100
+ }
101
+ finally {
102
+ if (durationTimer)
103
+ clearTimeout(durationTimer);
104
+ try {
105
+ await options.output.close();
106
+ }
107
+ catch (error) {
108
+ if (result.exitCode === 1) {
109
+ if (!isBrokenPipeError(error) && result.reason !== "output_error") {
110
+ diagnostics(`WebSocket output error during cleanup: ${errorMessage(error)}`);
111
+ }
112
+ }
113
+ else if (isBrokenPipeError(error)) {
114
+ result = { exitCode: 0, reason: "broken_pipe" };
115
+ }
116
+ else {
117
+ diagnostics(`WebSocket output error: ${errorMessage(error)}`);
118
+ result = { exitCode: 1, reason: "output_error" };
119
+ }
120
+ }
121
+ }
122
+ return result;
123
+ }
124
+ async function connectOnce(options) {
125
+ const socket = new WebSocket(options.request.url);
126
+ const requestJson = JSON.stringify(options.request.payload);
127
+ let settled = false;
128
+ let activeSince;
129
+ let openTimer;
130
+ let activationTimer;
131
+ let requestRetryTimer;
132
+ let retryRequestAttempts = 0;
133
+ let lastSocketError;
134
+ let resolveOutcome;
135
+ const outcomePromise = new Promise((resolve) => {
136
+ resolveOutcome = resolve;
137
+ });
138
+ const finish = (outcome) => {
139
+ if (settled)
140
+ return;
141
+ settled = true;
142
+ clearTimers();
143
+ resolveOutcome(outcome);
144
+ };
145
+ const reconnect = (delayMs = 0) => finish({
146
+ kind: "reconnect",
147
+ delayMs,
148
+ activeForMs: activeSince ? Date.now() - activeSince : 0,
149
+ });
150
+ const abort = () => finish({ kind: "aborted" });
151
+ const finishForDuration = () => {
152
+ options.diagnostics("WebSocket duration limit reached; closing.");
153
+ finish({ kind: "duration_reached" });
154
+ };
155
+ const failForOutput = () => {
156
+ const error = options.getOutputFailure();
157
+ if (!error || isBrokenPipeError(error))
158
+ finish({ kind: "broken_pipe" });
159
+ else {
160
+ options.diagnostics(`WebSocket output error: ${errorMessage(error)}`);
161
+ finish({ kind: "output_error" });
162
+ }
163
+ };
164
+ const clearTimers = () => {
165
+ if (openTimer)
166
+ clearTimeout(openTimer);
167
+ if (activationTimer)
168
+ clearTimeout(activationTimer);
169
+ if (requestRetryTimer)
170
+ clearTimeout(requestRetryTimer);
171
+ openTimer = undefined;
172
+ activationTimer = undefined;
173
+ requestRetryTimer = undefined;
174
+ };
175
+ if (options.signal?.aborted)
176
+ finish({ kind: "aborted" });
177
+ else
178
+ options.signal?.addEventListener("abort", abort, { once: true });
179
+ if (options.durationSignal.aborted)
180
+ finishForDuration();
181
+ else
182
+ options.durationSignal.addEventListener("abort", finishForDuration, { once: true });
183
+ if (options.outputFailureSignal.aborted)
184
+ failForOutput();
185
+ else
186
+ options.outputFailureSignal.addEventListener("abort", failForOutput, { once: true });
187
+ openTimer = setTimeout(() => {
188
+ options.diagnostics("WebSocket connection timed out before opening.");
189
+ reconnect();
190
+ }, options.openTimeoutMs);
191
+ socket.on("open", () => {
192
+ if (settled)
193
+ return;
194
+ if (openTimer)
195
+ clearTimeout(openTimer);
196
+ openTimer = undefined;
197
+ try {
198
+ socket.send(requestJson);
199
+ }
200
+ catch (error) {
201
+ options.diagnostics(`WebSocket subscription send failed: ${errorMessage(error)}`);
202
+ reconnect();
203
+ return;
204
+ }
205
+ activationTimer = setTimeout(() => {
206
+ options.diagnostics("WebSocket subscription timed out before becoming active.");
207
+ reconnect();
208
+ }, options.activationTimeoutMs);
209
+ });
210
+ socket.on("message", (raw, isBinary) => {
211
+ if (settled)
212
+ return;
213
+ if (isBinary) {
214
+ options.diagnostics("WebSocket protocol error: received an unexpected binary message.");
215
+ finish({ kind: "protocol_error" });
216
+ return;
217
+ }
218
+ const text = raw.toString();
219
+ if (text.trim() === "pong")
220
+ return;
221
+ let message;
222
+ try {
223
+ message = JSON.parse(text);
224
+ }
225
+ catch {
226
+ options.diagnostics("WebSocket protocol error: received a non-JSON text message.");
227
+ finish({ kind: "protocol_error" });
228
+ return;
229
+ }
230
+ const serverError = isObject(message) && typeof message.error === "string"
231
+ ? message
232
+ : undefined;
233
+ const errorDisposition = serverError
234
+ ? classifyServerError(serverError, options.request.endpoint)
235
+ : undefined;
236
+ if (serverError && errorDisposition?.kind === "terminal") {
237
+ options.diagnostics(`WebSocket server error: ${formatServerError(serverError)}`);
238
+ try {
239
+ options.output.enqueue(JSON.stringify(message));
240
+ }
241
+ catch (error) {
242
+ if (!isBrokenPipeError(error)) {
243
+ options.diagnostics(`WebSocket output error: ${errorMessage(error)}`);
244
+ }
245
+ }
246
+ finish({ kind: "terminal_error" });
247
+ return;
248
+ }
249
+ try {
250
+ options.output.enqueue(JSON.stringify(message));
251
+ }
252
+ catch (error) {
253
+ if (isBrokenPipeError(error))
254
+ finish({ kind: "broken_pipe" });
255
+ else {
256
+ options.diagnostics(`WebSocket output error: ${errorMessage(error)}`);
257
+ finish({ kind: "output_error" });
258
+ }
259
+ return;
260
+ }
261
+ if (!isObject(message))
262
+ return;
263
+ if (serverError && errorDisposition) {
264
+ handleServerError(serverError, errorDisposition);
265
+ return;
266
+ }
267
+ if (message.event === "subscription_status" && message.status === "active") {
268
+ activeSince ??= Date.now();
269
+ retryRequestAttempts = 0;
270
+ if (activationTimer)
271
+ clearTimeout(activationTimer);
272
+ activationTimer = undefined;
273
+ options.diagnostics(`WebSocket ${options.request.endpoint} subscription is active${typeof message.subscription_count === "number"
274
+ ? ` (${message.subscription_count} subscription${message.subscription_count === 1 ? "" : "s"})`
275
+ : ""}.`);
276
+ }
277
+ if (options.recordDataMessage(message)) {
278
+ options.diagnostics("WebSocket data message limit reached; closing.");
279
+ finish({ kind: "max_messages_reached" });
280
+ }
281
+ });
282
+ socket.on("unexpected-response", (_request, response) => {
283
+ void handleUnexpectedResponse(response, options.diagnostics).then((handshake) => {
284
+ if (handshake.detail)
285
+ options.diagnostics(handshake.detail);
286
+ if (handshake.retryable)
287
+ reconnect(handshake.delayMs);
288
+ else
289
+ finish({ kind: "terminal_error" });
290
+ });
291
+ });
292
+ socket.on("error", (error) => {
293
+ lastSocketError = error.message;
294
+ });
295
+ socket.on("close", (code, rawReason) => {
296
+ if (settled)
297
+ return;
298
+ const reason = rawReason.toString().trim();
299
+ const suffix = reason ? `: ${reason}` : lastSocketError ? `: ${lastSocketError}` : "";
300
+ options.diagnostics(`WebSocket closed (${code})${suffix}`);
301
+ reconnect();
302
+ });
303
+ function handleServerError(error, disposition) {
304
+ if (disposition.kind === "partial_validation") {
305
+ options.diagnostics(`WebSocket subscription warning: ${formatServerError(error)}`);
306
+ return;
307
+ }
308
+ if (disposition.kind === "server_wait") {
309
+ options.diagnostics(`WebSocket server is delaying the current request: ${formatServerError(error)}`);
310
+ return;
311
+ }
312
+ if (disposition.kind === "retry_request") {
313
+ if (requestRetryTimer)
314
+ return;
315
+ retryRequestAttempts += 1;
316
+ if (retryRequestAttempts > options.maxReconnectAttempts) {
317
+ options.diagnostics(`WebSocket request retry limit reached: ${formatServerError(error)}`);
318
+ finish({ kind: "retry_exhausted" });
319
+ return;
320
+ }
321
+ const delayMs = options.retryDelay(retryRequestAttempts, disposition.delayMs);
322
+ options.diagnostics(`WebSocket server requested a subscription retry in ${formatDelay(delayMs)}: ${formatServerError(error)}`);
323
+ requestRetryTimer = setTimeout(() => {
324
+ requestRetryTimer = undefined;
325
+ if (settled)
326
+ return;
327
+ if (socket.readyState !== WebSocket.OPEN) {
328
+ reconnect();
329
+ return;
330
+ }
331
+ socket.send(requestJson, (sendError) => {
332
+ if (sendError)
333
+ reconnect();
334
+ });
335
+ }, delayMs);
336
+ return;
337
+ }
338
+ if (disposition.kind === "reconnect") {
339
+ options.diagnostics(`WebSocket server requested reconnection: ${formatServerError(error)}`);
340
+ reconnect(disposition.delayMs);
341
+ return;
342
+ }
343
+ options.diagnostics(`WebSocket server error: ${formatServerError(error)}`);
344
+ finish({ kind: "terminal_error" });
345
+ }
346
+ const outcome = await outcomePromise;
347
+ clearTimers();
348
+ options.signal?.removeEventListener("abort", abort);
349
+ options.durationSignal.removeEventListener("abort", finishForDuration);
350
+ options.outputFailureSignal.removeEventListener("abort", failForOutput);
351
+ socket.removeAllListeners();
352
+ await closeSocket(socket, options.closeTimeoutMs);
353
+ return outcome;
354
+ }
355
+ function outcomeToResult(outcome) {
356
+ if (outcome.kind === "aborted" ||
357
+ outcome.kind === "broken_pipe" ||
358
+ outcome.kind === "duration_reached" ||
359
+ outcome.kind === "max_messages_reached") {
360
+ return { exitCode: 0, reason: outcome.kind };
361
+ }
362
+ return { exitCode: 1, reason: outcome.kind };
363
+ }
364
+ async function closeSocket(socket, timeoutMs) {
365
+ if (socket.readyState === WebSocket.CLOSED)
366
+ return;
367
+ if (socket.readyState === WebSocket.CONNECTING) {
368
+ socket.once("error", () => { });
369
+ socket.terminate();
370
+ return;
371
+ }
372
+ await new Promise((resolve) => {
373
+ let timer;
374
+ const done = () => {
375
+ clearTimeout(timer);
376
+ resolve();
377
+ };
378
+ socket.once("close", done);
379
+ socket.once("error", done);
380
+ if (socket.readyState === WebSocket.OPEN)
381
+ socket.close(1000, "client shutdown");
382
+ timer = setTimeout(() => {
383
+ socket.terminate();
384
+ resolve();
385
+ }, timeoutMs);
386
+ });
387
+ }
388
+ async function handleUnexpectedResponse(response, diagnostics) {
389
+ const chunks = [];
390
+ let bytes = 0;
391
+ try {
392
+ for await (const chunk of response) {
393
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
394
+ const remaining = MAX_HANDSHAKE_ERROR_BYTES - bytes;
395
+ if (remaining <= 0)
396
+ break;
397
+ chunks.push(buffer.subarray(0, remaining));
398
+ bytes += Math.min(buffer.length, remaining);
399
+ }
400
+ }
401
+ catch (error) {
402
+ diagnostics(`Unable to read the WebSocket handshake error: ${errorMessage(error)}`);
403
+ }
404
+ const body = Buffer.concat(chunks).toString("utf8").trim();
405
+ const status = response.statusCode ?? 0;
406
+ const detail = body
407
+ ? `WebSocket handshake failed (${status}): ${body}`
408
+ : `WebSocket handshake failed (${status}).`;
409
+ return {
410
+ retryable: status === 429,
411
+ delayMs: status === 429 ? retryAfterMs(response.headers["retry-after"]) : 0,
412
+ detail,
413
+ };
414
+ }
415
+ function retryAfterMs(value) {
416
+ const raw = Array.isArray(value) ? value[0] : value;
417
+ if (!raw)
418
+ return 0;
419
+ const seconds = Number(raw);
420
+ if (Number.isFinite(seconds))
421
+ return Math.max(0, Math.ceil(seconds * 1_000));
422
+ const date = Date.parse(raw);
423
+ return Number.isFinite(date) ? Math.max(0, date - Date.now()) : 0;
424
+ }
425
+ function equalJitterDelay(attempt, baseMs, maxMs, random) {
426
+ const cap = Math.min(maxMs, baseMs * 2 ** Math.max(0, attempt - 1));
427
+ return Math.round(cap / 2 + Math.min(1, Math.max(0, random())) * (cap / 2));
428
+ }
429
+ function abortableDelay(ms, signals) {
430
+ if (signals.some((signal) => signal?.aborted))
431
+ return Promise.resolve(false);
432
+ return new Promise((resolve) => {
433
+ const cleanup = () => {
434
+ for (const signal of signals)
435
+ signal?.removeEventListener("abort", abort);
436
+ };
437
+ const timer = setTimeout(() => {
438
+ cleanup();
439
+ resolve(true);
440
+ }, Math.max(0, ms));
441
+ const abort = () => {
442
+ clearTimeout(timer);
443
+ cleanup();
444
+ resolve(false);
445
+ };
446
+ for (const signal of signals)
447
+ signal?.addEventListener("abort", abort, { once: true });
448
+ });
449
+ }
450
+ function outputFailureResult(error, diagnostics) {
451
+ if (isBrokenPipeError(error))
452
+ return { exitCode: 0, reason: "broken_pipe" };
453
+ diagnostics(`WebSocket output error: ${errorMessage(error)}`);
454
+ return { exitCode: 1, reason: "output_error" };
455
+ }
456
+ function formatServerError(error) {
457
+ const parts = [error.error];
458
+ if (error.message)
459
+ parts.push(error.message);
460
+ if (error.reference_id)
461
+ parts.push(`reference_id=${error.reference_id}`);
462
+ return parts.join(" — ");
463
+ }
464
+ function formatDelay(delayMs) {
465
+ return delayMs < 1_000 ? `${delayMs}ms` : `${(delayMs / 1_000).toFixed(1)}s`;
466
+ }
467
+ function errorMessage(error) {
468
+ return error instanceof Error ? error.message : String(error);
469
+ }
470
+ function isObject(value) {
471
+ return Boolean(value && typeof value === "object" && !Array.isArray(value));
472
+ }
473
+ function isDataMessage(message, endpoint) {
474
+ if (!isObject(message) || typeof message.error === "string")
475
+ return false;
476
+ if (endpoint === "newsfeed")
477
+ return typeof message.event !== "string";
478
+ if ("server_time" in message)
479
+ return false;
480
+ return message.event !== "subscription_status" && message.event !== "connection_status";
481
+ }
482
+ //# sourceMappingURL=websocket-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-stream.js","sourceRoot":"","sources":["../src/websocket-stream.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@insightsentry/mcp",
3
3
  "mcpName": "io.github.rezmeplxrf/insightsentry_mcp",
4
- "version": "1.4.38",
4
+ "version": "1.4.40",
5
5
  "description": "MCP server for InsightSentry financial data API - provides AI-accessible tools for market data, screening, options, and comprehensive API documentation resources",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -48,11 +48,13 @@
48
48
  "chart.js": "^4.5.1",
49
49
  "chartjs-node-canvas": "^5.0.0",
50
50
  "jsonata": "^2.2.0",
51
+ "ws": "^8.21.3",
51
52
  "zod": "^4.4.3"
52
53
  },
53
54
  "devDependencies": {
54
55
  "@biomejs/biome": "2.4.10",
55
56
  "@types/node": "^22.19.19",
57
+ "@types/ws": "^8.18.1",
56
58
  "tsx": "^4.22.0",
57
59
  "typescript": "^5.9.3"
58
60
  },