fixparser-plugin-mcp 9.1.7-edd9ee17 → 9.1.7-eea80766
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.
- package/build/cjs/MCPLocal.js +117 -482
- package/build/cjs/MCPLocal.js.map +4 -4
- package/build/cjs/MCPRemote.js +435 -1328
- package/build/cjs/MCPRemote.js.map +4 -4
- package/build/esm/MCPLocal.mjs +117 -482
- package/build/esm/MCPLocal.mjs.map +4 -4
- package/build/esm/MCPRemote.mjs +444 -1318
- package/build/esm/MCPRemote.mjs.map +4 -4
- package/build-examples/cjs/example_mcp_local.js +7 -7
- package/build-examples/cjs/example_mcp_local.js.map +4 -4
- package/build-examples/esm/example_mcp_local.mjs +7 -7
- package/build-examples/esm/example_mcp_local.mjs.map +4 -4
- package/package.json +7 -7
- package/types/MCPLocal.d.ts +9 -25
- package/types/MCPRemote.d.ts +27 -25
- package/types/schemas/index.d.ts +15 -3
- package/types/tools/index.d.ts +11 -2
- package/types/tools/marketData.d.ts +28 -7
- package/types/tools/order.d.ts +3 -4
- package/types/tools/parse.d.ts +2 -2
- package/types/tools/parseToJSON.d.ts +2 -2
- package/build/cjs/index.js +0 -1627
- package/build/cjs/index.js.map +0 -7
- package/build/esm/index.mjs +0 -1589
- package/build/esm/index.mjs.map +0 -7
- package/build-examples/cjs/example_mcp_remote.js +0 -16
- package/build-examples/cjs/example_mcp_remote.js.map +0 -7
- package/build-examples/esm/example_mcp_remote.mjs +0 -16
- package/build-examples/esm/example_mcp_remote.mjs.map +0 -7
- package/types/MCPBase.d.ts +0 -49
- package/types/schemas/marketData.d.ts +0 -48
- package/types/utils/messageHandler.d.ts +0 -12
package/build/esm/MCPLocal.mjs
CHANGED
|
@@ -1,51 +1,9 @@
|
|
|
1
1
|
// src/MCPLocal.ts
|
|
2
2
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { Fields as Fields3, MDEntryType as MDEntryType2, Messages as Messages3 } from "fixparser";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
|
|
6
|
-
// src/MCPBase.ts
|
|
7
|
-
var MCPBase = class {
|
|
8
|
-
/**
|
|
9
|
-
* Optional logger instance for diagnostics and output.
|
|
10
|
-
* @protected
|
|
11
|
-
*/
|
|
12
|
-
logger;
|
|
13
|
-
/**
|
|
14
|
-
* FIXParser instance, set during plugin register().
|
|
15
|
-
* @protected
|
|
16
|
-
*/
|
|
17
|
-
parser;
|
|
18
|
-
/**
|
|
19
|
-
* Called when server is setup and listening.
|
|
20
|
-
* @protected
|
|
21
|
-
*/
|
|
22
|
-
onReady = void 0;
|
|
23
|
-
/**
|
|
24
|
-
* Map to store verified orders before execution
|
|
25
|
-
* @protected
|
|
26
|
-
*/
|
|
27
|
-
verifiedOrders = /* @__PURE__ */ new Map();
|
|
28
|
-
/**
|
|
29
|
-
* Map to store pending market data requests
|
|
30
|
-
* @protected
|
|
31
|
-
*/
|
|
32
|
-
pendingRequests = /* @__PURE__ */ new Map();
|
|
33
|
-
/**
|
|
34
|
-
* Map to store market data prices
|
|
35
|
-
* @protected
|
|
36
|
-
*/
|
|
37
|
-
marketDataPrices = /* @__PURE__ */ new Map();
|
|
38
|
-
/**
|
|
39
|
-
* Maximum number of price history entries to keep per symbol
|
|
40
|
-
* @protected
|
|
41
|
-
*/
|
|
42
|
-
MAX_PRICE_HISTORY = 1e5;
|
|
43
|
-
constructor({ logger, onReady }) {
|
|
44
|
-
this.logger = logger;
|
|
45
|
-
this.onReady = onReady;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
7
|
// src/schemas/schemas.ts
|
|
50
8
|
var toolSchemas = {
|
|
51
9
|
parse: {
|
|
@@ -129,7 +87,7 @@ var toolSchemas = {
|
|
|
129
87
|
}
|
|
130
88
|
},
|
|
131
89
|
executeOrder: {
|
|
132
|
-
description: "Executes a verified order. verifyOrder must be called before executeOrder.",
|
|
90
|
+
description: "Executes a verified order. verifyOrder must be called before executeOrder. user has to explicitly allow executeOrder.",
|
|
133
91
|
schema: {
|
|
134
92
|
type: "object",
|
|
135
93
|
properties: {
|
|
@@ -282,63 +240,10 @@ import QuickChart from "quickchart-js";
|
|
|
282
240
|
var createMarketDataRequestHandler = (parser, pendingRequests) => {
|
|
283
241
|
return async (args) => {
|
|
284
242
|
try {
|
|
285
|
-
parser.logger.log({
|
|
286
|
-
level: "info",
|
|
287
|
-
message: `Sending market data request for symbols: ${args.symbols.join(", ")}`
|
|
288
|
-
});
|
|
289
243
|
const response = new Promise((resolve) => {
|
|
290
244
|
pendingRequests.set(args.mdReqID, resolve);
|
|
291
|
-
parser.logger.log({
|
|
292
|
-
level: "info",
|
|
293
|
-
message: `Registered callback for market data request ID: ${args.mdReqID}`
|
|
294
|
-
});
|
|
295
245
|
});
|
|
296
|
-
const entryTypes = args.mdEntryTypes || [
|
|
297
|
-
MDEntryType.Bid,
|
|
298
|
-
MDEntryType.Offer,
|
|
299
|
-
MDEntryType.Trade,
|
|
300
|
-
MDEntryType.IndexValue,
|
|
301
|
-
MDEntryType.OpeningPrice,
|
|
302
|
-
MDEntryType.ClosingPrice,
|
|
303
|
-
MDEntryType.SettlementPrice,
|
|
304
|
-
MDEntryType.TradingSessionHighPrice,
|
|
305
|
-
MDEntryType.TradingSessionLowPrice,
|
|
306
|
-
MDEntryType.VWAP,
|
|
307
|
-
MDEntryType.Imbalance,
|
|
308
|
-
MDEntryType.TradeVolume,
|
|
309
|
-
MDEntryType.OpenInterest,
|
|
310
|
-
MDEntryType.CompositeUnderlyingPrice,
|
|
311
|
-
MDEntryType.SimulatedSellPrice,
|
|
312
|
-
MDEntryType.SimulatedBuyPrice,
|
|
313
|
-
MDEntryType.MarginRate,
|
|
314
|
-
MDEntryType.MidPrice,
|
|
315
|
-
MDEntryType.EmptyBook,
|
|
316
|
-
MDEntryType.SettleHighPrice,
|
|
317
|
-
MDEntryType.SettleLowPrice,
|
|
318
|
-
MDEntryType.PriorSettlePrice,
|
|
319
|
-
MDEntryType.SessionHighBid,
|
|
320
|
-
MDEntryType.SessionLowOffer,
|
|
321
|
-
MDEntryType.EarlyPrices,
|
|
322
|
-
MDEntryType.AuctionClearingPrice,
|
|
323
|
-
MDEntryType.SwapValueFactor,
|
|
324
|
-
MDEntryType.DailyValueAdjustmentForLongPositions,
|
|
325
|
-
MDEntryType.CumulativeValueAdjustmentForLongPositions,
|
|
326
|
-
MDEntryType.DailyValueAdjustmentForShortPositions,
|
|
327
|
-
MDEntryType.CumulativeValueAdjustmentForShortPositions,
|
|
328
|
-
MDEntryType.FixingPrice,
|
|
329
|
-
MDEntryType.CashRate,
|
|
330
|
-
MDEntryType.RecoveryRate,
|
|
331
|
-
MDEntryType.RecoveryRateForLong,
|
|
332
|
-
MDEntryType.RecoveryRateForShort,
|
|
333
|
-
MDEntryType.MarketBid,
|
|
334
|
-
MDEntryType.MarketOffer,
|
|
335
|
-
MDEntryType.ShortSaleMinPrice,
|
|
336
|
-
MDEntryType.PreviousClosingPrice,
|
|
337
|
-
MDEntryType.ThresholdLimitPriceBanding,
|
|
338
|
-
MDEntryType.DailyFinancingValue,
|
|
339
|
-
MDEntryType.AccruedFinancingValue,
|
|
340
|
-
MDEntryType.TWAP
|
|
341
|
-
];
|
|
246
|
+
const entryTypes = args.mdEntryTypes || [MDEntryType.Bid, MDEntryType.Offer, MDEntryType.TradeVolume];
|
|
342
247
|
const messageFields = [
|
|
343
248
|
new Field(Fields.MsgType, Messages.MarketDataRequest),
|
|
344
249
|
new Field(Fields.SenderCompID, parser.sender),
|
|
@@ -360,10 +265,6 @@ var createMarketDataRequestHandler = (parser, pendingRequests) => {
|
|
|
360
265
|
});
|
|
361
266
|
const mdr = parser.createMessage(...messageFields);
|
|
362
267
|
if (!parser.connected) {
|
|
363
|
-
parser.logger.log({
|
|
364
|
-
level: "error",
|
|
365
|
-
message: "Not connected. Cannot send market data request."
|
|
366
|
-
});
|
|
367
268
|
return {
|
|
368
269
|
content: [
|
|
369
270
|
{
|
|
@@ -375,16 +276,8 @@ var createMarketDataRequestHandler = (parser, pendingRequests) => {
|
|
|
375
276
|
isError: true
|
|
376
277
|
};
|
|
377
278
|
}
|
|
378
|
-
parser.logger.log({
|
|
379
|
-
level: "info",
|
|
380
|
-
message: `Sending market data request message: ${JSON.stringify(mdr?.toFIXJSON())}`
|
|
381
|
-
});
|
|
382
279
|
parser.send(mdr);
|
|
383
280
|
const fixData = await response;
|
|
384
|
-
parser.logger.log({
|
|
385
|
-
level: "info",
|
|
386
|
-
message: `Received market data response for request ID: ${args.mdReqID}`
|
|
387
|
-
});
|
|
388
281
|
return {
|
|
389
282
|
content: [
|
|
390
283
|
{
|
|
@@ -425,17 +318,13 @@ var createGetStockGraphHandler = (marketDataPrices) => {
|
|
|
425
318
|
};
|
|
426
319
|
}
|
|
427
320
|
const chart = new QuickChart();
|
|
428
|
-
chart.setWidth(
|
|
429
|
-
chart.setHeight(
|
|
430
|
-
chart.setBackgroundColor("transparent");
|
|
321
|
+
chart.setWidth(600);
|
|
322
|
+
chart.setHeight(300);
|
|
431
323
|
const labels = priceHistory.map((point) => new Date(point.timestamp).toLocaleTimeString());
|
|
432
324
|
const bidData = priceHistory.map((point) => point.bid);
|
|
433
325
|
const offerData = priceHistory.map((point) => point.offer);
|
|
434
326
|
const spreadData = priceHistory.map((point) => point.spread);
|
|
435
327
|
const volumeData = priceHistory.map((point) => point.volume);
|
|
436
|
-
const tradeData = priceHistory.map((point) => point.trade);
|
|
437
|
-
const vwapData = priceHistory.map((point) => point.vwap);
|
|
438
|
-
const twapData = priceHistory.map((point) => point.twap);
|
|
439
328
|
const config = {
|
|
440
329
|
type: "line",
|
|
441
330
|
data: {
|
|
@@ -465,30 +354,6 @@ var createGetStockGraphHandler = (marketDataPrices) => {
|
|
|
465
354
|
fill: false,
|
|
466
355
|
tension: 0.4
|
|
467
356
|
},
|
|
468
|
-
{
|
|
469
|
-
label: "Trade",
|
|
470
|
-
data: tradeData,
|
|
471
|
-
borderColor: "#ffc107",
|
|
472
|
-
backgroundColor: "rgba(255, 193, 7, 0.1)",
|
|
473
|
-
fill: false,
|
|
474
|
-
tension: 0.4
|
|
475
|
-
},
|
|
476
|
-
{
|
|
477
|
-
label: "VWAP",
|
|
478
|
-
data: vwapData,
|
|
479
|
-
borderColor: "#17a2b8",
|
|
480
|
-
backgroundColor: "rgba(23, 162, 184, 0.1)",
|
|
481
|
-
fill: false,
|
|
482
|
-
tension: 0.4
|
|
483
|
-
},
|
|
484
|
-
{
|
|
485
|
-
label: "TWAP",
|
|
486
|
-
data: twapData,
|
|
487
|
-
borderColor: "#6610f2",
|
|
488
|
-
backgroundColor: "rgba(102, 16, 242, 0.1)",
|
|
489
|
-
fill: false,
|
|
490
|
-
tension: 0.4
|
|
491
|
-
},
|
|
492
357
|
{
|
|
493
358
|
label: "Volume",
|
|
494
359
|
data: volumeData,
|
|
@@ -516,17 +381,24 @@ var createGetStockGraphHandler = (marketDataPrices) => {
|
|
|
516
381
|
};
|
|
517
382
|
chart.setConfig(config);
|
|
518
383
|
const imageBuffer = await chart.toBinary();
|
|
519
|
-
const
|
|
384
|
+
const base64Image = imageBuffer.toString("base64");
|
|
520
385
|
return {
|
|
521
386
|
content: [
|
|
522
387
|
{
|
|
523
|
-
type: "
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
mimeType: "image/png",
|
|
527
|
-
blob: base64
|
|
528
|
-
}
|
|
388
|
+
type: "image",
|
|
389
|
+
data: base64Image,
|
|
390
|
+
mimeType: "image/png"
|
|
529
391
|
}
|
|
392
|
+
// {
|
|
393
|
+
// type: 'image',
|
|
394
|
+
// image: {
|
|
395
|
+
// source: {
|
|
396
|
+
// filename: 'graph.png',
|
|
397
|
+
// data: `data:image/png;base64,${base64Image}`,
|
|
398
|
+
// },
|
|
399
|
+
// },
|
|
400
|
+
// mimeType: 'image/png',
|
|
401
|
+
// },
|
|
530
402
|
]
|
|
531
403
|
};
|
|
532
404
|
} catch (error) {
|
|
@@ -534,7 +406,7 @@ var createGetStockGraphHandler = (marketDataPrices) => {
|
|
|
534
406
|
content: [
|
|
535
407
|
{
|
|
536
408
|
type: "text",
|
|
537
|
-
text: `Error: ${error instanceof Error ? error.message : "Failed to generate
|
|
409
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to generate chart"}`,
|
|
538
410
|
uri: "getStockGraph"
|
|
539
411
|
}
|
|
540
412
|
],
|
|
@@ -572,48 +444,7 @@ var createGetStockPriceHistoryHandler = (marketDataPrices) => {
|
|
|
572
444
|
bid: point.bid,
|
|
573
445
|
offer: point.offer,
|
|
574
446
|
spread: point.spread,
|
|
575
|
-
volume: point.volume
|
|
576
|
-
trade: point.trade,
|
|
577
|
-
indexValue: point.indexValue,
|
|
578
|
-
openingPrice: point.openingPrice,
|
|
579
|
-
closingPrice: point.closingPrice,
|
|
580
|
-
settlementPrice: point.settlementPrice,
|
|
581
|
-
tradingSessionHighPrice: point.tradingSessionHighPrice,
|
|
582
|
-
tradingSessionLowPrice: point.tradingSessionLowPrice,
|
|
583
|
-
vwap: point.vwap,
|
|
584
|
-
imbalance: point.imbalance,
|
|
585
|
-
openInterest: point.openInterest,
|
|
586
|
-
compositeUnderlyingPrice: point.compositeUnderlyingPrice,
|
|
587
|
-
simulatedSellPrice: point.simulatedSellPrice,
|
|
588
|
-
simulatedBuyPrice: point.simulatedBuyPrice,
|
|
589
|
-
marginRate: point.marginRate,
|
|
590
|
-
midPrice: point.midPrice,
|
|
591
|
-
emptyBook: point.emptyBook,
|
|
592
|
-
settleHighPrice: point.settleHighPrice,
|
|
593
|
-
settleLowPrice: point.settleLowPrice,
|
|
594
|
-
priorSettlePrice: point.priorSettlePrice,
|
|
595
|
-
sessionHighBid: point.sessionHighBid,
|
|
596
|
-
sessionLowOffer: point.sessionLowOffer,
|
|
597
|
-
earlyPrices: point.earlyPrices,
|
|
598
|
-
auctionClearingPrice: point.auctionClearingPrice,
|
|
599
|
-
swapValueFactor: point.swapValueFactor,
|
|
600
|
-
dailyValueAdjustmentForLongPositions: point.dailyValueAdjustmentForLongPositions,
|
|
601
|
-
cumulativeValueAdjustmentForLongPositions: point.cumulativeValueAdjustmentForLongPositions,
|
|
602
|
-
dailyValueAdjustmentForShortPositions: point.dailyValueAdjustmentForShortPositions,
|
|
603
|
-
cumulativeValueAdjustmentForShortPositions: point.cumulativeValueAdjustmentForShortPositions,
|
|
604
|
-
fixingPrice: point.fixingPrice,
|
|
605
|
-
cashRate: point.cashRate,
|
|
606
|
-
recoveryRate: point.recoveryRate,
|
|
607
|
-
recoveryRateForLong: point.recoveryRateForLong,
|
|
608
|
-
recoveryRateForShort: point.recoveryRateForShort,
|
|
609
|
-
marketBid: point.marketBid,
|
|
610
|
-
marketOffer: point.marketOffer,
|
|
611
|
-
shortSaleMinPrice: point.shortSaleMinPrice,
|
|
612
|
-
previousClosingPrice: point.previousClosingPrice,
|
|
613
|
-
thresholdLimitPriceBanding: point.thresholdLimitPriceBanding,
|
|
614
|
-
dailyFinancingValue: point.dailyFinancingValue,
|
|
615
|
-
accruedFinancingValue: point.accruedFinancingValue,
|
|
616
|
-
twap: point.twap
|
|
447
|
+
volume: point.volume
|
|
617
448
|
}))
|
|
618
449
|
},
|
|
619
450
|
null,
|
|
@@ -628,7 +459,7 @@ var createGetStockPriceHistoryHandler = (marketDataPrices) => {
|
|
|
628
459
|
content: [
|
|
629
460
|
{
|
|
630
461
|
type: "text",
|
|
631
|
-
text: `Error: ${error instanceof Error ? error.message : "Failed to get price history"}`,
|
|
462
|
+
text: `Error: ${error instanceof Error ? error.message : "Failed to get stock price history"}`,
|
|
632
463
|
uri: "getStockPriceHistory"
|
|
633
464
|
}
|
|
634
465
|
],
|
|
@@ -736,7 +567,7 @@ Parameters verified:
|
|
|
736
567
|
- Symbol: ${args.symbol}
|
|
737
568
|
- TimeInForce: ${args.timeInForce} (${timeInForceNames[args.timeInForce]})
|
|
738
569
|
|
|
739
|
-
To execute this order, call the executeOrder tool with these exact same parameters
|
|
570
|
+
To execute this order, call the executeOrder tool with these exact same parameters.`,
|
|
740
571
|
uri: "verifyOrder"
|
|
741
572
|
}
|
|
742
573
|
]
|
|
@@ -935,285 +766,9 @@ var createToolHandlers = (parser, verifiedOrders, pendingRequests, marketDataPri
|
|
|
935
766
|
getStockPriceHistory: createGetStockPriceHistoryHandler(marketDataPrices)
|
|
936
767
|
});
|
|
937
768
|
|
|
938
|
-
// src/utils/messageHandler.ts
|
|
939
|
-
import { Fields as Fields3, MDEntryType as MDEntryType2, Messages as Messages3 } from "fixparser";
|
|
940
|
-
function handleMessage(message, parser, pendingRequests, marketDataPrices, maxPriceHistory, onPriceUpdate) {
|
|
941
|
-
parser.logger.log({
|
|
942
|
-
level: "info",
|
|
943
|
-
message: `MCP Server received message: ${message.messageType}: ${message.description}`
|
|
944
|
-
});
|
|
945
|
-
const msgType = message.messageType;
|
|
946
|
-
if (msgType === Messages3.MarketDataSnapshotFullRefresh || msgType === Messages3.MarketDataIncrementalRefresh) {
|
|
947
|
-
const symbol = message.getField(Fields3.Symbol)?.value;
|
|
948
|
-
parser.logger.log({
|
|
949
|
-
level: "info",
|
|
950
|
-
message: `Processing market data for symbol: ${symbol}`
|
|
951
|
-
});
|
|
952
|
-
const fixJson = message.toFIXJSON();
|
|
953
|
-
const entries = fixJson.Body?.NoMDEntries || [];
|
|
954
|
-
parser.logger.log({
|
|
955
|
-
level: "info",
|
|
956
|
-
message: `Found ${entries.length} market data entries`
|
|
957
|
-
});
|
|
958
|
-
const data = {
|
|
959
|
-
timestamp: Date.now(),
|
|
960
|
-
bid: 0,
|
|
961
|
-
offer: 0,
|
|
962
|
-
spread: 0,
|
|
963
|
-
volume: 0,
|
|
964
|
-
trade: 0,
|
|
965
|
-
indexValue: 0,
|
|
966
|
-
openingPrice: 0,
|
|
967
|
-
closingPrice: 0,
|
|
968
|
-
settlementPrice: 0,
|
|
969
|
-
tradingSessionHighPrice: 0,
|
|
970
|
-
tradingSessionLowPrice: 0,
|
|
971
|
-
vwap: 0,
|
|
972
|
-
imbalance: 0,
|
|
973
|
-
openInterest: 0,
|
|
974
|
-
compositeUnderlyingPrice: 0,
|
|
975
|
-
simulatedSellPrice: 0,
|
|
976
|
-
simulatedBuyPrice: 0,
|
|
977
|
-
marginRate: 0,
|
|
978
|
-
midPrice: 0,
|
|
979
|
-
emptyBook: 0,
|
|
980
|
-
settleHighPrice: 0,
|
|
981
|
-
settleLowPrice: 0,
|
|
982
|
-
priorSettlePrice: 0,
|
|
983
|
-
sessionHighBid: 0,
|
|
984
|
-
sessionLowOffer: 0,
|
|
985
|
-
earlyPrices: 0,
|
|
986
|
-
auctionClearingPrice: 0,
|
|
987
|
-
swapValueFactor: 0,
|
|
988
|
-
dailyValueAdjustmentForLongPositions: 0,
|
|
989
|
-
cumulativeValueAdjustmentForLongPositions: 0,
|
|
990
|
-
dailyValueAdjustmentForShortPositions: 0,
|
|
991
|
-
cumulativeValueAdjustmentForShortPositions: 0,
|
|
992
|
-
fixingPrice: 0,
|
|
993
|
-
cashRate: 0,
|
|
994
|
-
recoveryRate: 0,
|
|
995
|
-
recoveryRateForLong: 0,
|
|
996
|
-
recoveryRateForShort: 0,
|
|
997
|
-
marketBid: 0,
|
|
998
|
-
marketOffer: 0,
|
|
999
|
-
shortSaleMinPrice: 0,
|
|
1000
|
-
previousClosingPrice: 0,
|
|
1001
|
-
thresholdLimitPriceBanding: 0,
|
|
1002
|
-
dailyFinancingValue: 0,
|
|
1003
|
-
accruedFinancingValue: 0,
|
|
1004
|
-
twap: 0
|
|
1005
|
-
};
|
|
1006
|
-
for (const entry of entries) {
|
|
1007
|
-
const entryType = entry.MDEntryType;
|
|
1008
|
-
const price = entry.MDEntryPx ? Number.parseFloat(entry.MDEntryPx) : 0;
|
|
1009
|
-
const size = entry.MDEntrySize ? Number.parseFloat(entry.MDEntrySize) : 0;
|
|
1010
|
-
if (entryType === MDEntryType2.Bid || entryType === MDEntryType2.Offer || entryType === MDEntryType2.TradeVolume) {
|
|
1011
|
-
parser.logger.log({
|
|
1012
|
-
level: "info",
|
|
1013
|
-
message: `Market Data Entry - Type: ${entryType}, Price: ${price}, Size: ${size}`
|
|
1014
|
-
});
|
|
1015
|
-
}
|
|
1016
|
-
switch (entryType) {
|
|
1017
|
-
case MDEntryType2.Bid:
|
|
1018
|
-
data.bid = price;
|
|
1019
|
-
break;
|
|
1020
|
-
case MDEntryType2.Offer:
|
|
1021
|
-
data.offer = price;
|
|
1022
|
-
break;
|
|
1023
|
-
case MDEntryType2.Trade:
|
|
1024
|
-
data.trade = price;
|
|
1025
|
-
break;
|
|
1026
|
-
case MDEntryType2.IndexValue:
|
|
1027
|
-
data.indexValue = price;
|
|
1028
|
-
break;
|
|
1029
|
-
case MDEntryType2.OpeningPrice:
|
|
1030
|
-
data.openingPrice = price;
|
|
1031
|
-
break;
|
|
1032
|
-
case MDEntryType2.ClosingPrice:
|
|
1033
|
-
data.closingPrice = price;
|
|
1034
|
-
break;
|
|
1035
|
-
case MDEntryType2.SettlementPrice:
|
|
1036
|
-
data.settlementPrice = price;
|
|
1037
|
-
break;
|
|
1038
|
-
case MDEntryType2.TradingSessionHighPrice:
|
|
1039
|
-
data.tradingSessionHighPrice = price;
|
|
1040
|
-
break;
|
|
1041
|
-
case MDEntryType2.TradingSessionLowPrice:
|
|
1042
|
-
data.tradingSessionLowPrice = price;
|
|
1043
|
-
break;
|
|
1044
|
-
case MDEntryType2.VWAP:
|
|
1045
|
-
data.vwap = price;
|
|
1046
|
-
break;
|
|
1047
|
-
case MDEntryType2.Imbalance:
|
|
1048
|
-
data.imbalance = size;
|
|
1049
|
-
break;
|
|
1050
|
-
case MDEntryType2.TradeVolume:
|
|
1051
|
-
data.volume = size;
|
|
1052
|
-
break;
|
|
1053
|
-
case MDEntryType2.OpenInterest:
|
|
1054
|
-
data.openInterest = size;
|
|
1055
|
-
break;
|
|
1056
|
-
case MDEntryType2.CompositeUnderlyingPrice:
|
|
1057
|
-
data.compositeUnderlyingPrice = price;
|
|
1058
|
-
break;
|
|
1059
|
-
case MDEntryType2.SimulatedSellPrice:
|
|
1060
|
-
data.simulatedSellPrice = price;
|
|
1061
|
-
break;
|
|
1062
|
-
case MDEntryType2.SimulatedBuyPrice:
|
|
1063
|
-
data.simulatedBuyPrice = price;
|
|
1064
|
-
break;
|
|
1065
|
-
case MDEntryType2.MarginRate:
|
|
1066
|
-
data.marginRate = price;
|
|
1067
|
-
break;
|
|
1068
|
-
case MDEntryType2.MidPrice:
|
|
1069
|
-
data.midPrice = price;
|
|
1070
|
-
break;
|
|
1071
|
-
case MDEntryType2.EmptyBook:
|
|
1072
|
-
data.emptyBook = 1;
|
|
1073
|
-
break;
|
|
1074
|
-
case MDEntryType2.SettleHighPrice:
|
|
1075
|
-
data.settleHighPrice = price;
|
|
1076
|
-
break;
|
|
1077
|
-
case MDEntryType2.SettleLowPrice:
|
|
1078
|
-
data.settleLowPrice = price;
|
|
1079
|
-
break;
|
|
1080
|
-
case MDEntryType2.PriorSettlePrice:
|
|
1081
|
-
data.priorSettlePrice = price;
|
|
1082
|
-
break;
|
|
1083
|
-
case MDEntryType2.SessionHighBid:
|
|
1084
|
-
data.sessionHighBid = price;
|
|
1085
|
-
break;
|
|
1086
|
-
case MDEntryType2.SessionLowOffer:
|
|
1087
|
-
data.sessionLowOffer = price;
|
|
1088
|
-
break;
|
|
1089
|
-
case MDEntryType2.EarlyPrices:
|
|
1090
|
-
data.earlyPrices = price;
|
|
1091
|
-
break;
|
|
1092
|
-
case MDEntryType2.AuctionClearingPrice:
|
|
1093
|
-
data.auctionClearingPrice = price;
|
|
1094
|
-
break;
|
|
1095
|
-
case MDEntryType2.SwapValueFactor:
|
|
1096
|
-
data.swapValueFactor = price;
|
|
1097
|
-
break;
|
|
1098
|
-
case MDEntryType2.DailyValueAdjustmentForLongPositions:
|
|
1099
|
-
data.dailyValueAdjustmentForLongPositions = price;
|
|
1100
|
-
break;
|
|
1101
|
-
case MDEntryType2.CumulativeValueAdjustmentForLongPositions:
|
|
1102
|
-
data.cumulativeValueAdjustmentForLongPositions = price;
|
|
1103
|
-
break;
|
|
1104
|
-
case MDEntryType2.DailyValueAdjustmentForShortPositions:
|
|
1105
|
-
data.dailyValueAdjustmentForShortPositions = price;
|
|
1106
|
-
break;
|
|
1107
|
-
case MDEntryType2.CumulativeValueAdjustmentForShortPositions:
|
|
1108
|
-
data.cumulativeValueAdjustmentForShortPositions = price;
|
|
1109
|
-
break;
|
|
1110
|
-
case MDEntryType2.FixingPrice:
|
|
1111
|
-
data.fixingPrice = price;
|
|
1112
|
-
break;
|
|
1113
|
-
case MDEntryType2.CashRate:
|
|
1114
|
-
data.cashRate = price;
|
|
1115
|
-
break;
|
|
1116
|
-
case MDEntryType2.RecoveryRate:
|
|
1117
|
-
data.recoveryRate = price;
|
|
1118
|
-
break;
|
|
1119
|
-
case MDEntryType2.RecoveryRateForLong:
|
|
1120
|
-
data.recoveryRateForLong = price;
|
|
1121
|
-
break;
|
|
1122
|
-
case MDEntryType2.RecoveryRateForShort:
|
|
1123
|
-
data.recoveryRateForShort = price;
|
|
1124
|
-
break;
|
|
1125
|
-
case MDEntryType2.MarketBid:
|
|
1126
|
-
data.marketBid = price;
|
|
1127
|
-
break;
|
|
1128
|
-
case MDEntryType2.MarketOffer:
|
|
1129
|
-
data.marketOffer = price;
|
|
1130
|
-
break;
|
|
1131
|
-
case MDEntryType2.ShortSaleMinPrice:
|
|
1132
|
-
data.shortSaleMinPrice = price;
|
|
1133
|
-
break;
|
|
1134
|
-
case MDEntryType2.PreviousClosingPrice:
|
|
1135
|
-
data.previousClosingPrice = price;
|
|
1136
|
-
break;
|
|
1137
|
-
case MDEntryType2.ThresholdLimitPriceBanding:
|
|
1138
|
-
data.thresholdLimitPriceBanding = price;
|
|
1139
|
-
break;
|
|
1140
|
-
case MDEntryType2.DailyFinancingValue:
|
|
1141
|
-
data.dailyFinancingValue = price;
|
|
1142
|
-
break;
|
|
1143
|
-
case MDEntryType2.AccruedFinancingValue:
|
|
1144
|
-
data.accruedFinancingValue = price;
|
|
1145
|
-
break;
|
|
1146
|
-
case MDEntryType2.TWAP:
|
|
1147
|
-
data.twap = price;
|
|
1148
|
-
break;
|
|
1149
|
-
}
|
|
1150
|
-
}
|
|
1151
|
-
data.spread = data.offer - data.bid;
|
|
1152
|
-
if (!marketDataPrices.has(symbol)) {
|
|
1153
|
-
parser.logger.log({
|
|
1154
|
-
level: "info",
|
|
1155
|
-
message: `Creating new price history array for symbol: ${symbol}`
|
|
1156
|
-
});
|
|
1157
|
-
marketDataPrices.set(symbol, []);
|
|
1158
|
-
}
|
|
1159
|
-
const prices = marketDataPrices.get(symbol);
|
|
1160
|
-
prices.push(data);
|
|
1161
|
-
parser.logger.log({
|
|
1162
|
-
level: "info",
|
|
1163
|
-
message: `Updated price history for ${symbol}. Current size: ${prices.length}`
|
|
1164
|
-
});
|
|
1165
|
-
if (prices.length > maxPriceHistory) {
|
|
1166
|
-
prices.splice(0, prices.length - maxPriceHistory);
|
|
1167
|
-
parser.logger.log({
|
|
1168
|
-
level: "info",
|
|
1169
|
-
message: `Trimmed price history for ${symbol} to ${maxPriceHistory} entries`
|
|
1170
|
-
});
|
|
1171
|
-
}
|
|
1172
|
-
onPriceUpdate?.(symbol, data);
|
|
1173
|
-
const mdReqID = message.getField(Fields3.MDReqID)?.value;
|
|
1174
|
-
if (mdReqID) {
|
|
1175
|
-
const callback = pendingRequests.get(mdReqID);
|
|
1176
|
-
if (callback) {
|
|
1177
|
-
callback(message);
|
|
1178
|
-
pendingRequests.delete(mdReqID);
|
|
1179
|
-
parser.logger.log({
|
|
1180
|
-
level: "info",
|
|
1181
|
-
message: `Resolved market data request for ID: ${mdReqID}`
|
|
1182
|
-
});
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
} else if (msgType === Messages3.ExecutionReport) {
|
|
1186
|
-
const reqId = message.getField(Fields3.ClOrdID)?.value;
|
|
1187
|
-
const callback = pendingRequests.get(reqId);
|
|
1188
|
-
if (callback) {
|
|
1189
|
-
callback(message);
|
|
1190
|
-
pendingRequests.delete(reqId);
|
|
1191
|
-
}
|
|
1192
|
-
}
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
769
|
// src/MCPLocal.ts
|
|
1196
|
-
var MCPLocal = class
|
|
1197
|
-
|
|
1198
|
-
* Map to store verified orders before execution
|
|
1199
|
-
* @private
|
|
1200
|
-
*/
|
|
1201
|
-
verifiedOrders = /* @__PURE__ */ new Map();
|
|
1202
|
-
/**
|
|
1203
|
-
* Map to store pending requests and their callbacks
|
|
1204
|
-
* @private
|
|
1205
|
-
*/
|
|
1206
|
-
pendingRequests = /* @__PURE__ */ new Map();
|
|
1207
|
-
/**
|
|
1208
|
-
* Map to store market data prices for each symbol
|
|
1209
|
-
* @private
|
|
1210
|
-
*/
|
|
1211
|
-
marketDataPrices = /* @__PURE__ */ new Map();
|
|
1212
|
-
/**
|
|
1213
|
-
* Maximum number of price history entries to keep per symbol
|
|
1214
|
-
* @private
|
|
1215
|
-
*/
|
|
1216
|
-
MAX_PRICE_HISTORY = 1e5;
|
|
770
|
+
var MCPLocal = class {
|
|
771
|
+
parser;
|
|
1217
772
|
server = new Server(
|
|
1218
773
|
{
|
|
1219
774
|
name: "fixparser",
|
|
@@ -1235,13 +790,90 @@ var MCPLocal = class extends MCPBase {
|
|
|
1235
790
|
}
|
|
1236
791
|
);
|
|
1237
792
|
transport = new StdioServerTransport();
|
|
793
|
+
onReady = void 0;
|
|
794
|
+
pendingRequests = /* @__PURE__ */ new Map();
|
|
795
|
+
verifiedOrders = /* @__PURE__ */ new Map();
|
|
796
|
+
marketDataPrices = /* @__PURE__ */ new Map();
|
|
797
|
+
MAX_PRICE_HISTORY = 1e5;
|
|
798
|
+
// Maximum number of price points to store per symbol
|
|
1238
799
|
constructor({ logger, onReady }) {
|
|
1239
|
-
|
|
800
|
+
if (onReady) this.onReady = onReady;
|
|
1240
801
|
}
|
|
1241
802
|
async register(parser) {
|
|
1242
803
|
this.parser = parser;
|
|
1243
804
|
this.parser.addOnMessageCallback((message) => {
|
|
1244
|
-
|
|
805
|
+
this.parser?.logger.log({
|
|
806
|
+
level: "info",
|
|
807
|
+
message: `MCP Server received message: ${message.messageType}: ${message.description}`
|
|
808
|
+
});
|
|
809
|
+
const msgType = message.messageType;
|
|
810
|
+
if (msgType === Messages3.MarketDataSnapshotFullRefresh || msgType === Messages3.ExecutionReport || msgType === Messages3.Reject || msgType === Messages3.MarketDataIncrementalRefresh) {
|
|
811
|
+
this.parser?.logger.log({
|
|
812
|
+
level: "info",
|
|
813
|
+
message: `MCP Server handling message type: ${msgType}`
|
|
814
|
+
});
|
|
815
|
+
let id;
|
|
816
|
+
if (msgType === Messages3.MarketDataIncrementalRefresh || msgType === Messages3.MarketDataSnapshotFullRefresh) {
|
|
817
|
+
const symbol = message.getField(Fields3.Symbol);
|
|
818
|
+
const entryType = message.getField(Fields3.MDEntryType);
|
|
819
|
+
const price = message.getField(Fields3.MDEntryPx);
|
|
820
|
+
const size = message.getField(Fields3.MDEntrySize);
|
|
821
|
+
const timestamp = message.getField(Fields3.MDEntryTime)?.value || Date.now();
|
|
822
|
+
if (symbol?.value && price?.value) {
|
|
823
|
+
const symbolStr = String(symbol.value);
|
|
824
|
+
const priceNum = Number(price.value);
|
|
825
|
+
const sizeNum = size?.value ? Number(size.value) : 0;
|
|
826
|
+
const priceHistory = this.marketDataPrices.get(symbolStr) || [];
|
|
827
|
+
const lastEntry = priceHistory[priceHistory.length - 1] || {
|
|
828
|
+
timestamp: 0,
|
|
829
|
+
bid: 0,
|
|
830
|
+
offer: 0,
|
|
831
|
+
spread: 0,
|
|
832
|
+
volume: 0
|
|
833
|
+
};
|
|
834
|
+
const newEntry = {
|
|
835
|
+
timestamp: Number(timestamp),
|
|
836
|
+
bid: entryType?.value === MDEntryType2.Bid ? priceNum : lastEntry.bid,
|
|
837
|
+
offer: entryType?.value === MDEntryType2.Offer ? priceNum : lastEntry.offer,
|
|
838
|
+
spread: entryType?.value === MDEntryType2.Offer ? priceNum - lastEntry.bid : entryType?.value === MDEntryType2.Bid ? lastEntry.offer - priceNum : lastEntry.spread,
|
|
839
|
+
volume: entryType?.value === MDEntryType2.TradeVolume ? sizeNum : lastEntry.volume
|
|
840
|
+
};
|
|
841
|
+
priceHistory.push(newEntry);
|
|
842
|
+
if (priceHistory.length > this.MAX_PRICE_HISTORY) {
|
|
843
|
+
priceHistory.shift();
|
|
844
|
+
}
|
|
845
|
+
this.marketDataPrices.set(symbolStr, priceHistory);
|
|
846
|
+
this.parser?.logger.log({
|
|
847
|
+
level: "info",
|
|
848
|
+
message: `MCP Server added ${symbol}: ${JSON.stringify(newEntry)}`
|
|
849
|
+
});
|
|
850
|
+
this.server.notification({
|
|
851
|
+
method: "priceUpdate",
|
|
852
|
+
params: {
|
|
853
|
+
symbol: symbolStr,
|
|
854
|
+
...newEntry
|
|
855
|
+
}
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
if (msgType === Messages3.MarketDataSnapshotFullRefresh) {
|
|
860
|
+
const mdReqID = message.getField(Fields3.MDReqID);
|
|
861
|
+
if (mdReqID) id = String(mdReqID.value);
|
|
862
|
+
} else if (msgType === Messages3.ExecutionReport) {
|
|
863
|
+
const clOrdID = message.getField(Fields3.ClOrdID);
|
|
864
|
+
if (clOrdID) id = String(clOrdID.value);
|
|
865
|
+
} else if (msgType === Messages3.Reject) {
|
|
866
|
+
const refSeqNum = message.getField(Fields3.RefSeqNum);
|
|
867
|
+
if (refSeqNum) id = String(refSeqNum.value);
|
|
868
|
+
}
|
|
869
|
+
if (id) {
|
|
870
|
+
const callback = this.pendingRequests.get(id);
|
|
871
|
+
if (callback) {
|
|
872
|
+
callback(message);
|
|
873
|
+
this.pendingRequests.delete(id);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
1245
877
|
});
|
|
1246
878
|
this.addWorkflows();
|
|
1247
879
|
await this.server.connect(this.transport);
|
|
@@ -1256,15 +888,18 @@ var MCPLocal = class extends MCPBase {
|
|
|
1256
888
|
if (!this.server) {
|
|
1257
889
|
return;
|
|
1258
890
|
}
|
|
1259
|
-
this.server.setRequestHandler(
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
description,
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
891
|
+
this.server.setRequestHandler(
|
|
892
|
+
z.object({ method: z.literal("tools/list") }),
|
|
893
|
+
async (request, extra) => {
|
|
894
|
+
return {
|
|
895
|
+
tools: Object.entries(toolSchemas).map(([name, { description, schema }]) => ({
|
|
896
|
+
name,
|
|
897
|
+
description,
|
|
898
|
+
inputSchema: schema
|
|
899
|
+
}))
|
|
900
|
+
};
|
|
901
|
+
}
|
|
902
|
+
);
|
|
1268
903
|
this.server.setRequestHandler(
|
|
1269
904
|
z.object({
|
|
1270
905
|
method: z.literal("tools/call"),
|
|
@@ -1276,7 +911,7 @@ var MCPLocal = class extends MCPBase {
|
|
|
1276
911
|
}).optional()
|
|
1277
912
|
})
|
|
1278
913
|
}),
|
|
1279
|
-
async (request) => {
|
|
914
|
+
async (request, extra) => {
|
|
1280
915
|
const { name, arguments: args } = request.params;
|
|
1281
916
|
const toolHandlers = createToolHandlers(
|
|
1282
917
|
this.parser,
|