fixparser-plugin-mcp 9.1.7-2eb6d03c → 9.1.7-33c7782a
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 +40 -26
- package/build/cjs/MCPLocal.js.map +2 -2
- package/build/esm/MCPLocal.mjs +40 -26
- package/build/esm/MCPLocal.mjs.map +2 -2
- package/build-examples/cjs/example_mcp_local.js +4 -3
- package/build-examples/cjs/example_mcp_local.js.map +4 -4
- package/build-examples/esm/example_mcp_local.mjs +4 -3
- package/build-examples/esm/example_mcp_local.mjs.map +4 -4
- package/package.json +8 -7
package/build/cjs/MCPLocal.js
CHANGED
|
@@ -58,7 +58,7 @@ var newOrderSingleInputSchema = {
|
|
|
58
58
|
type: "string",
|
|
59
59
|
enum: ["1", "2", "3"],
|
|
60
60
|
default: import_fixparser.HandlInst.AutomatedExecutionNoIntervention,
|
|
61
|
-
description:
|
|
61
|
+
description: 'Handling instruction (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Manual, "2" for Automated, "3" for AutomatedNoIntervention)'
|
|
62
62
|
},
|
|
63
63
|
quantity: {
|
|
64
64
|
type: "number",
|
|
@@ -99,12 +99,12 @@ var newOrderSingleInputSchema = {
|
|
|
99
99
|
"S"
|
|
100
100
|
],
|
|
101
101
|
default: import_fixparser.OrdType.Market,
|
|
102
|
-
description:
|
|
102
|
+
description: 'Order type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Market, "2" for Limit, "3" for Stop)'
|
|
103
103
|
},
|
|
104
104
|
side: {
|
|
105
105
|
type: "string",
|
|
106
106
|
enum: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H"],
|
|
107
|
-
description:
|
|
107
|
+
description: 'Order side (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Buy, "2" for Sell, "3" for BuyMinus, "4" for SellPlus, "5" for SellShort, "6" for SellShortExempt, "7" for Undisclosed, "8" for Cross, "9" for CrossShort, "A" for CrossShortExempt, "B" for AsDefined, "C" for Opposite, "D" for Subscribe, "E" for Redeem, "F" for Lend, "G" for Borrow, "H" for SellUndisclosed)'
|
|
108
108
|
},
|
|
109
109
|
symbol: {
|
|
110
110
|
type: "string",
|
|
@@ -114,7 +114,7 @@ var newOrderSingleInputSchema = {
|
|
|
114
114
|
type: "string",
|
|
115
115
|
enum: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"],
|
|
116
116
|
default: import_fixparser.TimeInForce.Day,
|
|
117
|
-
description:
|
|
117
|
+
description: 'Time in force (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Day, "1" for Good Till Cancel, "2" for At Opening, "3" for Immediate or Cancel, "4" for Fill or Kill, "5" for Good Till Crossing, "6" for Good Till Date)'
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
120
|
required: ["clOrdID", "quantity", "price", "side", "symbol"]
|
|
@@ -126,7 +126,7 @@ var marketDataRequestInputSchema = {
|
|
|
126
126
|
type: "string",
|
|
127
127
|
enum: ["0", "1"],
|
|
128
128
|
default: "0",
|
|
129
|
-
description:
|
|
129
|
+
description: 'Market data update type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for FullRefresh, "1" for IncrementalRefresh)'
|
|
130
130
|
},
|
|
131
131
|
symbol: {
|
|
132
132
|
type: "string",
|
|
@@ -140,7 +140,7 @@ var marketDataRequestInputSchema = {
|
|
|
140
140
|
type: "string",
|
|
141
141
|
enum: ["0", "1", "2"],
|
|
142
142
|
default: import_fixparser.SubscriptionRequestType.SnapshotAndUpdates,
|
|
143
|
-
description:
|
|
143
|
+
description: 'Subscription request type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Snapshot + Updates, "1" for Snapshot, "2" for Unsubscribe)'
|
|
144
144
|
},
|
|
145
145
|
mdEntryType: {
|
|
146
146
|
type: "string",
|
|
@@ -191,7 +191,7 @@ var marketDataRequestInputSchema = {
|
|
|
191
191
|
"t"
|
|
192
192
|
],
|
|
193
193
|
default: import_fixparser.MDEntryType.Bid,
|
|
194
|
-
description:
|
|
194
|
+
description: 'Market data entry type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Bid, "1" for Offer, "2" for Trade, "3" for Index Value, "4" for Opening Price)'
|
|
195
195
|
}
|
|
196
196
|
},
|
|
197
197
|
required: ["symbol", "mdReqID"]
|
|
@@ -205,23 +205,28 @@ var MCPLocal = class {
|
|
|
205
205
|
version: "1.0.0"
|
|
206
206
|
},
|
|
207
207
|
{
|
|
208
|
-
capabilities: {
|
|
208
|
+
capabilities: {
|
|
209
|
+
tools: {},
|
|
210
|
+
prompts: {},
|
|
211
|
+
resources: {}
|
|
212
|
+
}
|
|
209
213
|
}
|
|
210
214
|
);
|
|
211
215
|
transport = new import_stdio.StdioServerTransport();
|
|
212
216
|
onReady = void 0;
|
|
213
217
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
214
218
|
constructor({ logger, onReady }) {
|
|
215
|
-
if (logger
|
|
219
|
+
if (logger && !logger.silent) {
|
|
220
|
+
this.logger = logger;
|
|
221
|
+
}
|
|
216
222
|
if (onReady) this.onReady = onReady;
|
|
217
223
|
}
|
|
218
224
|
async register(parser) {
|
|
219
225
|
this.parser = parser;
|
|
226
|
+
if (parser.logger && !parser.logger.silent) {
|
|
227
|
+
this.logger = parser.logger;
|
|
228
|
+
}
|
|
220
229
|
this.parser.addOnMessageCallback((message) => {
|
|
221
|
-
this.logger?.log({
|
|
222
|
-
level: "info",
|
|
223
|
-
message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`
|
|
224
|
-
});
|
|
225
230
|
const msgType = message.messageType;
|
|
226
231
|
if (msgType === import_fixparser.Messages.MarketDataSnapshotFullRefresh || msgType === import_fixparser.Messages.ExecutionReport) {
|
|
227
232
|
const idField = msgType === import_fixparser.Messages.MarketDataSnapshotFullRefresh ? message.getField(import_fixparser.Fields.MDReqID) : message.getField(import_fixparser.Fields.ClOrdID);
|
|
@@ -237,7 +242,6 @@ var MCPLocal = class {
|
|
|
237
242
|
}
|
|
238
243
|
}
|
|
239
244
|
});
|
|
240
|
-
this.logger = parser.logger;
|
|
241
245
|
this.addWorkflows();
|
|
242
246
|
await this.server.connect(this.transport);
|
|
243
247
|
if (this.onReady) {
|
|
@@ -323,7 +327,8 @@ var MCPLocal = class {
|
|
|
323
327
|
content: [
|
|
324
328
|
{
|
|
325
329
|
type: "text",
|
|
326
|
-
text:
|
|
330
|
+
text: `${parsedMessage[0].description}
|
|
331
|
+
${parsedMessage[0].messageTypeDescription}`
|
|
327
332
|
}
|
|
328
333
|
]
|
|
329
334
|
};
|
|
@@ -353,7 +358,7 @@ var MCPLocal = class {
|
|
|
353
358
|
content: [
|
|
354
359
|
{
|
|
355
360
|
type: "text",
|
|
356
|
-
text:
|
|
361
|
+
text: `${parsedMessage[0].toFIXJSON()}`
|
|
357
362
|
}
|
|
358
363
|
]
|
|
359
364
|
};
|
|
@@ -557,7 +562,7 @@ var MCPLocal = class {
|
|
|
557
562
|
},
|
|
558
563
|
{
|
|
559
564
|
name: "side",
|
|
560
|
-
description: "Order side (1=Buy, 2=Sell)",
|
|
565
|
+
description: "Order side (1=Buy, 2=Sell, 3=BuyMinus, 4=SellPlus, 5=SellShort, 6=SellShortExempt, 7=Undisclosed, 8=Cross, 9=CrossShort, A=CrossShortExempt, B=AsDefined, C=Opposite, D=Subscribe, E=Redeem, F=Lend, G=Borrow, H=SellUndisclosed)",
|
|
561
566
|
required: true
|
|
562
567
|
},
|
|
563
568
|
{
|
|
@@ -648,15 +653,20 @@ var MCPLocal = class {
|
|
|
648
653
|
text: [
|
|
649
654
|
"Create a New Order Single FIX message with the following parameters:",
|
|
650
655
|
`- ClOrdID: ${clOrdID}`,
|
|
651
|
-
`- HandlInst: ${handlInst ?? "
|
|
656
|
+
`- HandlInst: ${handlInst ?? "3"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Manual, '2' for Automated, '3' for AutomatedNoIntervention)`,
|
|
652
657
|
`- Quantity: ${quantity}`,
|
|
653
658
|
`- Price: ${price}`,
|
|
654
|
-
`- OrdType: ${ordType ?? "
|
|
655
|
-
`- Side: ${side}`,
|
|
659
|
+
`- OrdType: ${ordType ?? "1"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Market, '2' for Limit, '3' for Stop)`,
|
|
660
|
+
`- Side: ${side} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Buy, '2' for Sell)`,
|
|
656
661
|
`- Symbol: ${symbol}`,
|
|
657
|
-
`- TimeInForce: ${timeInForce ?? "
|
|
662
|
+
`- TimeInForce: ${timeInForce ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Day, '1' for Good Till Cancel, '2' for At Opening, '3' for Immediate or Cancel, '4' for Fill or Kill, '5' for Good Till Crossing, '6' for Good Till Date)`,
|
|
663
|
+
"",
|
|
664
|
+
"Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.",
|
|
658
665
|
"",
|
|
659
|
-
|
|
666
|
+
'Note: For the Side parameter, always use the numeric/alphabetic value (e.g., "1" for Buy, "2" for Sell) as defined in the FIX protocol, not the descriptive name.',
|
|
667
|
+
'Note: For the HandlInst parameter, always use the numeric/alphabetic value (e.g., "1" for Manual, "2" for Automated, "3" for AutomatedNoIntervention) as defined in the FIX protocol, not the descriptive name.',
|
|
668
|
+
'Note: For the OrdType parameter, always use the numeric/alphabetic value (e.g., "1" for Market, "2" for Limit, "3" for Stop) as defined in the FIX protocol, not the descriptive name.',
|
|
669
|
+
'Note: For the TimeInForce parameter, always use the numeric/alphabetic value (e.g., "0" for Day, "1" for Good Till Cancel, "2" for At Opening) as defined in the FIX protocol, not the descriptive name.'
|
|
660
670
|
].join("\n")
|
|
661
671
|
}
|
|
662
672
|
}
|
|
@@ -673,13 +683,17 @@ var MCPLocal = class {
|
|
|
673
683
|
type: "text",
|
|
674
684
|
text: [
|
|
675
685
|
"Create a Market Data Request FIX message with the following parameters:",
|
|
676
|
-
`- MDUpdateType: ${mdUpdateType ?? "
|
|
686
|
+
`- MDUpdateType: ${mdUpdateType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for FullRefresh, '1' for IncrementalRefresh)`,
|
|
677
687
|
`- Symbol: ${symbol}`,
|
|
678
688
|
`- MDReqID: ${mdReqID}`,
|
|
679
|
-
`- SubscriptionRequestType: ${subscriptionRequestType ?? "
|
|
680
|
-
`- MDEntryType: ${mdEntryType ?? "
|
|
689
|
+
`- SubscriptionRequestType: ${subscriptionRequestType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Snapshot + Updates, '1' for Snapshot, '2' for Unsubscribe)`,
|
|
690
|
+
`- MDEntryType: ${mdEntryType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Bid, '1' for Offer, '2' for Trade, '3' for Index Value, '4' for Opening Price)`,
|
|
691
|
+
"",
|
|
692
|
+
"Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.",
|
|
681
693
|
"",
|
|
682
|
-
|
|
694
|
+
'Note: For the MDUpdateType parameter, always use the numeric/alphabetic value (e.g., "0" for FullRefresh, "1" for IncrementalRefresh) as defined in the FIX protocol, not the descriptive name.',
|
|
695
|
+
'Note: For the SubscriptionRequestType parameter, always use the numeric/alphabetic value (e.g., "0" for Snapshot + Updates, "1" for Snapshot, "2" for Unsubscribe) as defined in the FIX protocol, not the descriptive name.',
|
|
696
|
+
'Note: For the MDEntryType parameter, always use the numeric/alphabetic value (e.g., "0" for Bid, "1" for Offer, "2" for Trade, "3" for Index Value, "4" for Opening Price) as defined in the FIX protocol, not the descriptive name.'
|
|
683
697
|
].join("\n")
|
|
684
698
|
}
|
|
685
699
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/MCPLocal.ts"],
|
|
4
|
-
"sourcesContent": ["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport {\n Field,\n Fields,\n HandlInst,\n type IFIXParser,\n type Logger,\n MDEntryType,\n type Message,\n Messages,\n OrdType,\n SubscriptionRequestType,\n TimeInForce,\n} from 'fixparser';\nimport type { IPlugin } from 'fixparser-common';\nimport type { PluginOptions } from './PluginOptions';\n\n// Define JSON Schemas\nconst parseInputSchema = {\n type: 'object',\n properties: {\n fixString: {\n type: 'string',\n description: 'FIX message string to parse',\n },\n },\n required: ['fixString'],\n};\n\nconst parseToJSONInputSchema = {\n type: 'object',\n properties: {\n fixString: {\n type: 'string',\n description: 'FIX message string to parse',\n },\n },\n required: ['fixString'],\n};\n\nconst newOrderSingleInputSchema = {\n type: 'object',\n properties: {\n clOrdID: {\n type: 'string',\n description: 'Client Order ID',\n },\n handlInst: {\n type: 'string',\n enum: ['1', '2', '3'],\n default: HandlInst.AutomatedExecutionNoIntervention,\n description: 'Handling instruction',\n },\n quantity: {\n type: 'number',\n description: 'Order quantity',\n },\n price: {\n type: 'number',\n description: 'Order price',\n },\n ordType: {\n type: 'string',\n enum: [\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'P',\n 'Q',\n 'R',\n 'S',\n ],\n default: OrdType.Market,\n description: 'Order type',\n },\n side: {\n type: 'string',\n enum: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],\n description: 'Order side (1=Buy, 2=Sell)',\n },\n symbol: {\n type: 'string',\n description: 'Trading symbol',\n },\n timeInForce: {\n type: 'string',\n enum: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'],\n default: TimeInForce.Day,\n description: 'Time in force',\n },\n },\n required: ['clOrdID', 'quantity', 'price', 'side', 'symbol'],\n};\n\nconst marketDataRequestInputSchema = {\n type: 'object',\n properties: {\n mdUpdateType: {\n type: 'string',\n enum: ['0', '1'],\n default: '0',\n description: 'Market data update type',\n },\n symbol: {\n type: 'string',\n description: 'Trading symbol',\n },\n mdReqID: {\n type: 'string',\n description: 'Market data request ID',\n },\n subscriptionRequestType: {\n type: 'string',\n enum: ['0', '1', '2'],\n default: SubscriptionRequestType.SnapshotAndUpdates,\n description: 'Subscription request type',\n },\n mdEntryType: {\n type: 'string',\n enum: [\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'S',\n 'R',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'g',\n 'h',\n 'i',\n 't',\n ],\n default: MDEntryType.Bid,\n description: 'Market data entry type',\n },\n },\n required: ['symbol', 'mdReqID'],\n};\n\nexport class MCPLocal implements IPlugin<IFIXParser> {\n private logger: Logger | undefined;\n private parser: IFIXParser | undefined;\n private server: Server = new Server(\n {\n name: 'fixparser',\n version: '1.0.0',\n },\n {\n capabilities: { tools: {} },\n },\n );\n private transport: StdioServerTransport = new StdioServerTransport();\n private onReady: (() => void) | undefined = undefined;\n\n private pendingRequests: Map<string, (data: Message) => void> = new Map();\n\n constructor({ logger, onReady }: PluginOptions) {\n if (logger) this.logger = logger;\n if (onReady) this.onReady = onReady;\n }\n\n public async register(parser: IFIXParser): Promise<void> {\n this.parser = parser;\n this.parser.addOnMessageCallback((message: Message) => {\n this.logger?.log({\n level: 'info',\n message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`,\n });\n const msgType = message.messageType;\n if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {\n const idField =\n msgType === Messages.MarketDataSnapshotFullRefresh\n ? message.getField(Fields.MDReqID)\n : message.getField(Fields.ClOrdID);\n if (idField) {\n const id = idField.value;\n if (typeof id === 'string' || typeof id === 'number') {\n const callback = this.pendingRequests.get(String(id));\n if (callback) {\n callback(message);\n this.pendingRequests.delete(String(id));\n }\n }\n }\n }\n });\n\n this.logger = parser.logger;\n\n this.addWorkflows();\n\n await this.server.connect(this.transport);\n\n if (this.onReady) {\n this.onReady();\n }\n }\n\n private addWorkflows() {\n if (!this.parser) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- FIXParser instance not initialized. Ignoring setup of workflows...',\n });\n return;\n }\n\n if (!this.server) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- MCP Server not initialized. Ignoring setup of workflows...',\n });\n return;\n }\n\n // Helper function to validate and parse arguments\n const validateArgs = (args: any, schema: any): any => {\n // Basic validation - in a real implementation, you might want to use a proper JSON Schema validator\n const result: any = {};\n\n for (const [key, propSchema] of Object.entries(schema.properties || {})) {\n const prop = propSchema as any;\n const value = args?.[key];\n\n if (prop.required && (value === undefined || value === null)) {\n throw new Error(`Required property '${key}' is missing`);\n }\n\n if (value !== undefined) {\n // Apply defaults\n result[key] = value;\n } else if (prop.default !== undefined) {\n result[key] = prop.default;\n }\n }\n\n return result;\n };\n\n // Empty handler for resources\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [],\n };\n });\n\n // Handler for listing available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'parse',\n description: 'Parses a FIX message and describes it in plain language',\n inputSchema: parseInputSchema,\n },\n {\n name: 'parseToJSON',\n description: 'Parses a FIX message into JSON',\n inputSchema: parseToJSONInputSchema,\n },\n {\n name: 'newOrderSingle',\n description: 'Creates and sends a New Order Single',\n inputSchema: newOrderSingleInputSchema,\n },\n {\n name: 'marketDataRequest',\n description: 'Sends a request for Market Data with the given symbol',\n inputSchema: marketDataRequestInputSchema,\n },\n ],\n };\n });\n\n // Handler for tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case 'parse': {\n try {\n const { fixString } = validateArgs(args, parseInputSchema);\n const parsedMessage = this.parser?.parse(fixString);\n if (!parsedMessage || parsedMessage.length === 0) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Failed to parse FIX string' }],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: `Parsed FIX message: ${fixString} (placeholder implementation)`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to parse FIX string'}`,\n },\n ],\n };\n }\n }\n\n case 'parseToJSON': {\n try {\n const { fixString } = validateArgs(args, parseToJSONInputSchema);\n const parsedMessage = this.parser?.parse(fixString);\n if (!parsedMessage || parsedMessage.length === 0) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Failed to parse FIX string' }],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ fixString, parsed: 'placeholder' }),\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to parse FIX string'}`,\n },\n ],\n };\n }\n }\n\n case 'newOrderSingle': {\n try {\n const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } =\n validateArgs(args, newOrderSingleInputSchema);\n\n const response = new Promise((resolve) => {\n this.pendingRequests.set(clOrdID, resolve);\n });\n\n const order: Message | undefined = this.parser?.createMessage(\n new Field(Fields.MsgType, Messages.NewOrderSingle),\n new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),\n new Field(Fields.SenderCompID, this.parser?.sender),\n new Field(Fields.TargetCompID, this.parser?.target),\n new Field(Fields.SendingTime, this.parser?.getTimestamp()),\n new Field(Fields.ClOrdID, clOrdID),\n new Field(Fields.Side, side),\n new Field(Fields.Symbol, symbol),\n new Field(Fields.OrderQty, quantity),\n new Field(Fields.Price, price),\n new Field(Fields.OrdType, ordType),\n new Field(Fields.HandlInst, handlInst),\n new Field(Fields.TimeInForce, timeInForce),\n new Field(Fields.TransactTime, this.parser?.getTimestamp()),\n );\n\n if (!this.parser?.connected) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- Not connected. Ignoring message.',\n });\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Not connected. Ignoring message.',\n },\n ],\n };\n }\n\n this.parser?.send(order!);\n this.logger?.log({\n level: 'info',\n message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${order?.description}`,\n });\n\n const fixData = await response;\n return {\n content: [\n {\n type: 'text',\n text: `Execution Report for order ${clOrdID}: ${JSON.stringify((fixData as Message).toFIXJSON())}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to create order'}`,\n },\n ],\n };\n }\n }\n\n case 'marketDataRequest': {\n try {\n const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = validateArgs(\n args,\n marketDataRequestInputSchema,\n );\n\n const response = new Promise((resolve) => {\n this.pendingRequests.set(mdReqID, resolve);\n });\n\n const marketDataRequest = this.parser?.createMessage(\n new Field(Fields.MsgType, Messages.MarketDataRequest),\n new Field(Fields.SenderCompID, this.parser?.sender),\n new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),\n new Field(Fields.TargetCompID, this.parser?.target),\n new Field(Fields.SendingTime, this.parser?.getTimestamp()),\n new Field(Fields.MarketDepth, 0),\n new Field(Fields.MDUpdateType, mdUpdateType),\n new Field(Fields.NoRelatedSym, 1),\n new Field(Fields.Symbol, symbol),\n new Field(Fields.MDReqID, mdReqID),\n new Field(Fields.SubscriptionRequestType, subscriptionRequestType),\n new Field(Fields.NoMDEntryTypes, 1),\n new Field(Fields.MDEntryType, mdEntryType),\n );\n\n if (!this.parser?.connected) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- Not connected. Ignoring message.',\n });\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Not connected. Ignoring message.',\n },\n ],\n };\n }\n\n this.parser?.send(marketDataRequest!);\n this.logger?.log({\n level: 'info',\n message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${marketDataRequest?.description}`,\n });\n\n const fixData = await response;\n\n return {\n content: [\n {\n type: 'text',\n text: `Market data for ${symbol}: ${JSON.stringify((fixData as Message).toFIXJSON())}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to request market data'}`,\n },\n ],\n };\n }\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n return {\n prompts: [\n {\n name: 'parse',\n description: 'Parses a FIX message and describes it in plain language',\n arguments: [\n {\n name: 'fixString',\n description: 'FIX message string to parse',\n required: true,\n },\n ],\n },\n {\n name: 'parseToJSON',\n description: 'Parses a FIX message into JSON',\n arguments: [\n {\n name: 'fixString',\n description: 'FIX message string to parse',\n required: true,\n },\n ],\n },\n {\n name: 'newOrderSingle',\n description: 'Creates and sends a New Order Single',\n arguments: [\n {\n name: 'clOrdID',\n description: 'Client Order ID',\n required: true,\n },\n {\n name: 'handlInst',\n description: 'Handling instruction',\n required: false,\n },\n {\n name: 'quantity',\n description: 'Order quantity',\n required: true,\n },\n {\n name: 'price',\n description: 'Order price',\n required: true,\n },\n {\n name: 'ordType',\n description: 'Order type',\n required: false,\n },\n {\n name: 'side',\n description: 'Order side (1=Buy, 2=Sell)',\n required: true,\n },\n {\n name: 'symbol',\n description: 'Trading symbol',\n required: true,\n },\n {\n name: 'timeInForce',\n description: 'Time in force',\n required: false,\n },\n ],\n },\n {\n name: 'marketDataRequest',\n description: 'Sends a request for Market Data with the given symbol',\n arguments: [\n {\n name: 'mdUpdateType',\n description: 'Market data update type',\n required: false,\n },\n {\n name: 'symbol',\n description: 'Trading symbol',\n required: true,\n },\n {\n name: 'mdReqID',\n description: 'Market data request ID',\n required: true,\n },\n {\n name: 'subscriptionRequestType',\n description: 'Subscription request type',\n required: false,\n },\n {\n name: 'mdEntryType',\n description: 'Market data entry type',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n // Handler for getting specific prompts\n this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case 'parse': {\n const fixString = args?.fixString || '';\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Please parse and explain this FIX message: ${fixString}`,\n },\n },\n ],\n };\n }\n\n case 'parseToJSON': {\n const fixString = args?.fixString || '';\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Please parse the FIX message to JSON: ${fixString}`,\n },\n },\n ],\n };\n }\n\n case 'newOrderSingle': {\n const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'Create a New Order Single FIX message with the following parameters:',\n `- ClOrdID: ${clOrdID}`,\n `- HandlInst: ${handlInst ?? 'default'}`,\n `- Quantity: ${quantity}`,\n `- Price: ${price}`,\n `- OrdType: ${ordType ?? 'default (Market)'}`,\n `- Side: ${side}`,\n `- Symbol: ${symbol}`,\n `- TimeInForce: ${timeInForce ?? 'default (Day)'}`,\n '',\n 'Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.',\n ].join('\\n'),\n },\n },\n ],\n };\n }\n\n case 'marketDataRequest': {\n const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = args || {};\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'Create a Market Data Request FIX message with the following parameters:',\n `- MDUpdateType: ${mdUpdateType ?? 'default (0 = FullRefresh)'}`,\n `- Symbol: ${symbol}`,\n `- MDReqID: ${mdReqID}`,\n `- SubscriptionRequestType: ${subscriptionRequestType ?? 'default (0 = Snapshot + Updates)'}`,\n `- MDEntryType: ${mdEntryType ?? 'default (0 = Bid)'}`,\n '',\n 'Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.',\n ].join('\\n'),\n },\n },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n });\n\n process.on('SIGINT', async () => {\n await this.server.close();\n process.exit(0);\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n GetPromptRequestSchema,\n ListPromptsRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nimport {\n Field,\n Fields,\n HandlInst,\n type IFIXParser,\n type Logger,\n MDEntryType,\n type Message,\n Messages,\n OrdType,\n SubscriptionRequestType,\n TimeInForce,\n} from 'fixparser';\nimport type { IPlugin } from 'fixparser-common';\nimport type { PluginOptions } from './PluginOptions';\n\n// Define JSON Schemas\nconst parseInputSchema = {\n type: 'object',\n properties: {\n fixString: {\n type: 'string',\n description: 'FIX message string to parse',\n },\n },\n required: ['fixString'],\n};\n\nconst parseToJSONInputSchema = {\n type: 'object',\n properties: {\n fixString: {\n type: 'string',\n description: 'FIX message string to parse',\n },\n },\n required: ['fixString'],\n};\n\nconst newOrderSingleInputSchema = {\n type: 'object',\n properties: {\n clOrdID: {\n type: 'string',\n description: 'Client Order ID',\n },\n handlInst: {\n type: 'string',\n enum: ['1', '2', '3'],\n default: HandlInst.AutomatedExecutionNoIntervention,\n description:\n 'Handling instruction (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"1\" for Manual, \"2\" for Automated, \"3\" for AutomatedNoIntervention)',\n },\n quantity: {\n type: 'number',\n description: 'Order quantity',\n },\n price: {\n type: 'number',\n description: 'Order price',\n },\n ordType: {\n type: 'string',\n enum: [\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'I',\n 'J',\n 'K',\n 'L',\n 'M',\n 'P',\n 'Q',\n 'R',\n 'S',\n ],\n default: OrdType.Market,\n description:\n 'Order type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"1\" for Market, \"2\" for Limit, \"3\" for Stop)',\n },\n side: {\n type: 'string',\n enum: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],\n description:\n 'Order side (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"1\" for Buy, \"2\" for Sell, \"3\" for BuyMinus, \"4\" for SellPlus, \"5\" for SellShort, \"6\" for SellShortExempt, \"7\" for Undisclosed, \"8\" for Cross, \"9\" for CrossShort, \"A\" for CrossShortExempt, \"B\" for AsDefined, \"C\" for Opposite, \"D\" for Subscribe, \"E\" for Redeem, \"F\" for Lend, \"G\" for Borrow, \"H\" for SellUndisclosed)',\n },\n symbol: {\n type: 'string',\n description: 'Trading symbol',\n },\n timeInForce: {\n type: 'string',\n enum: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'],\n default: TimeInForce.Day,\n description:\n 'Time in force (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"0\" for Day, \"1\" for Good Till Cancel, \"2\" for At Opening, \"3\" for Immediate or Cancel, \"4\" for Fill or Kill, \"5\" for Good Till Crossing, \"6\" for Good Till Date)',\n },\n },\n required: ['clOrdID', 'quantity', 'price', 'side', 'symbol'],\n};\n\nconst marketDataRequestInputSchema = {\n type: 'object',\n properties: {\n mdUpdateType: {\n type: 'string',\n enum: ['0', '1'],\n default: '0',\n description:\n 'Market data update type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"0\" for FullRefresh, \"1\" for IncrementalRefresh)',\n },\n symbol: {\n type: 'string',\n description: 'Trading symbol',\n },\n mdReqID: {\n type: 'string',\n description: 'Market data request ID',\n },\n subscriptionRequestType: {\n type: 'string',\n enum: ['0', '1', '2'],\n default: SubscriptionRequestType.SnapshotAndUpdates,\n description:\n 'Subscription request type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"0\" for Snapshot + Updates, \"1\" for Snapshot, \"2\" for Unsubscribe)',\n },\n mdEntryType: {\n type: 'string',\n enum: [\n '0',\n '1',\n '2',\n '3',\n '4',\n '5',\n '6',\n '7',\n '8',\n '9',\n 'A',\n 'B',\n 'C',\n 'D',\n 'E',\n 'F',\n 'G',\n 'H',\n 'J',\n 'K',\n 'L',\n 'M',\n 'N',\n 'O',\n 'P',\n 'Q',\n 'S',\n 'R',\n 'T',\n 'U',\n 'V',\n 'W',\n 'X',\n 'Y',\n 'Z',\n 'a',\n 'b',\n 'c',\n 'd',\n 'e',\n 'g',\n 'h',\n 'i',\n 't',\n ],\n default: MDEntryType.Bid,\n description:\n 'Market data entry type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use \"0\" for Bid, \"1\" for Offer, \"2\" for Trade, \"3\" for Index Value, \"4\" for Opening Price)',\n },\n },\n required: ['symbol', 'mdReqID'],\n};\n\nexport class MCPLocal implements IPlugin<IFIXParser> {\n private logger: Logger | undefined;\n private parser: IFIXParser | undefined;\n private server: Server = new Server(\n {\n name: 'fixparser',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n prompts: {},\n resources: {},\n },\n },\n );\n private transport: StdioServerTransport = new StdioServerTransport();\n private onReady: (() => void) | undefined = undefined;\n\n private pendingRequests: Map<string, (data: Message) => void> = new Map();\n\n constructor({ logger, onReady }: PluginOptions) {\n if (logger && !logger.silent) {\n this.logger = logger;\n }\n\n if (onReady) this.onReady = onReady;\n }\n\n public async register(parser: IFIXParser): Promise<void> {\n this.parser = parser;\n if (parser.logger && !parser.logger.silent) {\n this.logger = parser.logger;\n }\n this.parser.addOnMessageCallback((message: Message) => {\n // this.logger?.log({\n // level: 'info',\n // message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`,\n // });\n const msgType = message.messageType;\n if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {\n const idField =\n msgType === Messages.MarketDataSnapshotFullRefresh\n ? message.getField(Fields.MDReqID)\n : message.getField(Fields.ClOrdID);\n if (idField) {\n const id = idField.value;\n if (typeof id === 'string' || typeof id === 'number') {\n const callback = this.pendingRequests.get(String(id));\n if (callback) {\n callback(message);\n this.pendingRequests.delete(String(id));\n }\n }\n }\n }\n });\n\n this.addWorkflows();\n\n await this.server.connect(this.transport);\n\n if (this.onReady) {\n this.onReady();\n }\n }\n\n private addWorkflows() {\n if (!this.parser) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- FIXParser instance not initialized. Ignoring setup of workflows...',\n });\n return;\n }\n\n if (!this.server) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- MCP Server not initialized. Ignoring setup of workflows...',\n });\n return;\n }\n\n // Helper function to validate and parse arguments\n const validateArgs = (args: any, schema: any): any => {\n // Basic validation - in a real implementation, you might want to use a proper JSON Schema validator\n const result: any = {};\n\n for (const [key, propSchema] of Object.entries(schema.properties || {})) {\n const prop = propSchema as any;\n const value = args?.[key];\n\n if (prop.required && (value === undefined || value === null)) {\n throw new Error(`Required property '${key}' is missing`);\n }\n\n if (value !== undefined) {\n // Apply defaults\n result[key] = value;\n } else if (prop.default !== undefined) {\n result[key] = prop.default;\n }\n }\n\n return result;\n };\n\n // Empty handler for resources\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [],\n };\n });\n\n // Handler for listing available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: 'parse',\n description: 'Parses a FIX message and describes it in plain language',\n inputSchema: parseInputSchema,\n },\n {\n name: 'parseToJSON',\n description: 'Parses a FIX message into JSON',\n inputSchema: parseToJSONInputSchema,\n },\n {\n name: 'newOrderSingle',\n description: 'Creates and sends a New Order Single',\n inputSchema: newOrderSingleInputSchema,\n },\n {\n name: 'marketDataRequest',\n description: 'Sends a request for Market Data with the given symbol',\n inputSchema: marketDataRequestInputSchema,\n },\n ],\n };\n });\n\n // Handler for tool calls\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case 'parse': {\n try {\n const { fixString } = validateArgs(args, parseInputSchema);\n const parsedMessage: Message[] | undefined = this.parser?.parse(fixString);\n if (!parsedMessage || parsedMessage.length === 0) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Failed to parse FIX string' }],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: `${parsedMessage[0].description}\n${parsedMessage[0].messageTypeDescription}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to parse FIX string'}`,\n },\n ],\n };\n }\n }\n\n case 'parseToJSON': {\n try {\n const { fixString } = validateArgs(args, parseToJSONInputSchema);\n const parsedMessage = this.parser?.parse(fixString);\n if (!parsedMessage || parsedMessage.length === 0) {\n return {\n isError: true,\n content: [{ type: 'text', text: 'Error: Failed to parse FIX string' }],\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: `${parsedMessage[0].toFIXJSON()}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to parse FIX string'}`,\n },\n ],\n };\n }\n }\n\n case 'newOrderSingle': {\n try {\n const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } =\n validateArgs(args, newOrderSingleInputSchema);\n\n const response = new Promise((resolve) => {\n this.pendingRequests.set(clOrdID, resolve);\n });\n\n const order: Message | undefined = this.parser?.createMessage(\n new Field(Fields.MsgType, Messages.NewOrderSingle),\n new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),\n new Field(Fields.SenderCompID, this.parser?.sender),\n new Field(Fields.TargetCompID, this.parser?.target),\n new Field(Fields.SendingTime, this.parser?.getTimestamp()),\n new Field(Fields.ClOrdID, clOrdID),\n new Field(Fields.Side, side),\n new Field(Fields.Symbol, symbol),\n new Field(Fields.OrderQty, quantity),\n new Field(Fields.Price, price),\n new Field(Fields.OrdType, ordType),\n new Field(Fields.HandlInst, handlInst),\n new Field(Fields.TimeInForce, timeInForce),\n new Field(Fields.TransactTime, this.parser?.getTimestamp()),\n );\n\n if (!this.parser?.connected) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- Not connected. Ignoring message.',\n });\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Not connected. Ignoring message.',\n },\n ],\n };\n }\n\n this.parser?.send(order!);\n this.logger?.log({\n level: 'info',\n message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${order?.description}`,\n });\n\n const fixData = await response;\n return {\n content: [\n {\n type: 'text',\n text: `Execution Report for order ${clOrdID}: ${JSON.stringify((fixData as Message).toFIXJSON())}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to create order'}`,\n },\n ],\n };\n }\n }\n\n case 'marketDataRequest': {\n try {\n const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = validateArgs(\n args,\n marketDataRequestInputSchema,\n );\n\n const response = new Promise((resolve) => {\n this.pendingRequests.set(mdReqID, resolve);\n });\n\n const marketDataRequest = this.parser?.createMessage(\n new Field(Fields.MsgType, Messages.MarketDataRequest),\n new Field(Fields.SenderCompID, this.parser?.sender),\n new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),\n new Field(Fields.TargetCompID, this.parser?.target),\n new Field(Fields.SendingTime, this.parser?.getTimestamp()),\n new Field(Fields.MarketDepth, 0),\n new Field(Fields.MDUpdateType, mdUpdateType),\n new Field(Fields.NoRelatedSym, 1),\n new Field(Fields.Symbol, symbol),\n new Field(Fields.MDReqID, mdReqID),\n new Field(Fields.SubscriptionRequestType, subscriptionRequestType),\n new Field(Fields.NoMDEntryTypes, 1),\n new Field(Fields.MDEntryType, mdEntryType),\n );\n\n if (!this.parser?.connected) {\n this.logger?.log({\n level: 'error',\n message: 'FIXParser (MCP): -- Not connected. Ignoring message.',\n });\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: 'Error: Not connected. Ignoring message.',\n },\n ],\n };\n }\n\n this.parser?.send(marketDataRequest!);\n this.logger?.log({\n level: 'info',\n message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${marketDataRequest?.description}`,\n });\n\n const fixData = await response;\n\n return {\n content: [\n {\n type: 'text',\n text: `Market data for ${symbol}: ${JSON.stringify((fixData as Message).toFIXJSON())}`,\n },\n ],\n };\n } catch (error) {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${error instanceof Error ? error.message : 'Failed to request market data'}`,\n },\n ],\n };\n }\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n });\n\n this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n return {\n prompts: [\n {\n name: 'parse',\n description: 'Parses a FIX message and describes it in plain language',\n arguments: [\n {\n name: 'fixString',\n description: 'FIX message string to parse',\n required: true,\n },\n ],\n },\n {\n name: 'parseToJSON',\n description: 'Parses a FIX message into JSON',\n arguments: [\n {\n name: 'fixString',\n description: 'FIX message string to parse',\n required: true,\n },\n ],\n },\n {\n name: 'newOrderSingle',\n description: 'Creates and sends a New Order Single',\n arguments: [\n {\n name: 'clOrdID',\n description: 'Client Order ID',\n required: true,\n },\n {\n name: 'handlInst',\n description: 'Handling instruction',\n required: false,\n },\n {\n name: 'quantity',\n description: 'Order quantity',\n required: true,\n },\n {\n name: 'price',\n description: 'Order price',\n required: true,\n },\n {\n name: 'ordType',\n description: 'Order type',\n required: false,\n },\n {\n name: 'side',\n description:\n 'Order side (1=Buy, 2=Sell, 3=BuyMinus, 4=SellPlus, 5=SellShort, 6=SellShortExempt, 7=Undisclosed, 8=Cross, 9=CrossShort, A=CrossShortExempt, B=AsDefined, C=Opposite, D=Subscribe, E=Redeem, F=Lend, G=Borrow, H=SellUndisclosed)',\n required: true,\n },\n {\n name: 'symbol',\n description: 'Trading symbol',\n required: true,\n },\n {\n name: 'timeInForce',\n description: 'Time in force',\n required: false,\n },\n ],\n },\n {\n name: 'marketDataRequest',\n description: 'Sends a request for Market Data with the given symbol',\n arguments: [\n {\n name: 'mdUpdateType',\n description: 'Market data update type',\n required: false,\n },\n {\n name: 'symbol',\n description: 'Trading symbol',\n required: true,\n },\n {\n name: 'mdReqID',\n description: 'Market data request ID',\n required: true,\n },\n {\n name: 'subscriptionRequestType',\n description: 'Subscription request type',\n required: false,\n },\n {\n name: 'mdEntryType',\n description: 'Market data entry type',\n required: false,\n },\n ],\n },\n ],\n };\n });\n\n // Handler for getting specific prompts\n this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case 'parse': {\n const fixString = args?.fixString || '';\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Please parse and explain this FIX message: ${fixString}`,\n },\n },\n ],\n };\n }\n\n case 'parseToJSON': {\n const fixString = args?.fixString || '';\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `Please parse the FIX message to JSON: ${fixString}`,\n },\n },\n ],\n };\n }\n\n case 'newOrderSingle': {\n const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'Create a New Order Single FIX message with the following parameters:',\n `- ClOrdID: ${clOrdID}`,\n `- HandlInst: ${handlInst ?? '3'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Manual, '2' for Automated, '3' for AutomatedNoIntervention)`,\n `- Quantity: ${quantity}`,\n `- Price: ${price}`,\n `- OrdType: ${ordType ?? '1'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Market, '2' for Limit, '3' for Stop)`,\n `- Side: ${side} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Buy, '2' for Sell)`,\n `- Symbol: ${symbol}`,\n `- TimeInForce: ${timeInForce ?? '0'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Day, '1' for Good Till Cancel, '2' for At Opening, '3' for Immediate or Cancel, '4' for Fill or Kill, '5' for Good Till Crossing, '6' for Good Till Date)`,\n '',\n 'Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.',\n '',\n 'Note: For the Side parameter, always use the numeric/alphabetic value (e.g., \"1\" for Buy, \"2\" for Sell) as defined in the FIX protocol, not the descriptive name.',\n 'Note: For the HandlInst parameter, always use the numeric/alphabetic value (e.g., \"1\" for Manual, \"2\" for Automated, \"3\" for AutomatedNoIntervention) as defined in the FIX protocol, not the descriptive name.',\n 'Note: For the OrdType parameter, always use the numeric/alphabetic value (e.g., \"1\" for Market, \"2\" for Limit, \"3\" for Stop) as defined in the FIX protocol, not the descriptive name.',\n 'Note: For the TimeInForce parameter, always use the numeric/alphabetic value (e.g., \"0\" for Day, \"1\" for Good Till Cancel, \"2\" for At Opening) as defined in the FIX protocol, not the descriptive name.',\n ].join('\\n'),\n },\n },\n ],\n };\n }\n\n case 'marketDataRequest': {\n const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = args || {};\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: [\n 'Create a Market Data Request FIX message with the following parameters:',\n `- MDUpdateType: ${mdUpdateType ?? '0'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for FullRefresh, '1' for IncrementalRefresh)`,\n `- Symbol: ${symbol}`,\n `- MDReqID: ${mdReqID}`,\n `- SubscriptionRequestType: ${subscriptionRequestType ?? '0'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Snapshot + Updates, '1' for Snapshot, '2' for Unsubscribe)`,\n `- MDEntryType: ${mdEntryType ?? '0'} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Bid, '1' for Offer, '2' for Trade, '3' for Index Value, '4' for Opening Price)`,\n '',\n 'Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.',\n '',\n 'Note: For the MDUpdateType parameter, always use the numeric/alphabetic value (e.g., \"0\" for FullRefresh, \"1\" for IncrementalRefresh) as defined in the FIX protocol, not the descriptive name.',\n 'Note: For the SubscriptionRequestType parameter, always use the numeric/alphabetic value (e.g., \"0\" for Snapshot + Updates, \"1\" for Snapshot, \"2\" for Unsubscribe) as defined in the FIX protocol, not the descriptive name.',\n 'Note: For the MDEntryType parameter, always use the numeric/alphabetic value (e.g., \"0\" for Bid, \"1\" for Offer, \"2\" for Trade, \"3\" for Index Value, \"4\" for Opening Price) as defined in the FIX protocol, not the descriptive name.',\n ].join('\\n'),\n },\n },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n });\n\n process.on('SIGINT', async () => {\n await this.server.close();\n process.exit(0);\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/esm/MCPLocal.mjs
CHANGED
|
@@ -49,7 +49,7 @@ var newOrderSingleInputSchema = {
|
|
|
49
49
|
type: "string",
|
|
50
50
|
enum: ["1", "2", "3"],
|
|
51
51
|
default: HandlInst.AutomatedExecutionNoIntervention,
|
|
52
|
-
description:
|
|
52
|
+
description: 'Handling instruction (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Manual, "2" for Automated, "3" for AutomatedNoIntervention)'
|
|
53
53
|
},
|
|
54
54
|
quantity: {
|
|
55
55
|
type: "number",
|
|
@@ -90,12 +90,12 @@ var newOrderSingleInputSchema = {
|
|
|
90
90
|
"S"
|
|
91
91
|
],
|
|
92
92
|
default: OrdType.Market,
|
|
93
|
-
description:
|
|
93
|
+
description: 'Order type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Market, "2" for Limit, "3" for Stop)'
|
|
94
94
|
},
|
|
95
95
|
side: {
|
|
96
96
|
type: "string",
|
|
97
97
|
enum: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H"],
|
|
98
|
-
description:
|
|
98
|
+
description: 'Order side (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "1" for Buy, "2" for Sell, "3" for BuyMinus, "4" for SellPlus, "5" for SellShort, "6" for SellShortExempt, "7" for Undisclosed, "8" for Cross, "9" for CrossShort, "A" for CrossShortExempt, "B" for AsDefined, "C" for Opposite, "D" for Subscribe, "E" for Redeem, "F" for Lend, "G" for Borrow, "H" for SellUndisclosed)'
|
|
99
99
|
},
|
|
100
100
|
symbol: {
|
|
101
101
|
type: "string",
|
|
@@ -105,7 +105,7 @@ var newOrderSingleInputSchema = {
|
|
|
105
105
|
type: "string",
|
|
106
106
|
enum: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"],
|
|
107
107
|
default: TimeInForce.Day,
|
|
108
|
-
description:
|
|
108
|
+
description: 'Time in force (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Day, "1" for Good Till Cancel, "2" for At Opening, "3" for Immediate or Cancel, "4" for Fill or Kill, "5" for Good Till Crossing, "6" for Good Till Date)'
|
|
109
109
|
}
|
|
110
110
|
},
|
|
111
111
|
required: ["clOrdID", "quantity", "price", "side", "symbol"]
|
|
@@ -117,7 +117,7 @@ var marketDataRequestInputSchema = {
|
|
|
117
117
|
type: "string",
|
|
118
118
|
enum: ["0", "1"],
|
|
119
119
|
default: "0",
|
|
120
|
-
description:
|
|
120
|
+
description: 'Market data update type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for FullRefresh, "1" for IncrementalRefresh)'
|
|
121
121
|
},
|
|
122
122
|
symbol: {
|
|
123
123
|
type: "string",
|
|
@@ -131,7 +131,7 @@ var marketDataRequestInputSchema = {
|
|
|
131
131
|
type: "string",
|
|
132
132
|
enum: ["0", "1", "2"],
|
|
133
133
|
default: SubscriptionRequestType.SnapshotAndUpdates,
|
|
134
|
-
description:
|
|
134
|
+
description: 'Subscription request type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Snapshot + Updates, "1" for Snapshot, "2" for Unsubscribe)'
|
|
135
135
|
},
|
|
136
136
|
mdEntryType: {
|
|
137
137
|
type: "string",
|
|
@@ -182,7 +182,7 @@ var marketDataRequestInputSchema = {
|
|
|
182
182
|
"t"
|
|
183
183
|
],
|
|
184
184
|
default: MDEntryType.Bid,
|
|
185
|
-
description:
|
|
185
|
+
description: 'Market data entry type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for Bid, "1" for Offer, "2" for Trade, "3" for Index Value, "4" for Opening Price)'
|
|
186
186
|
}
|
|
187
187
|
},
|
|
188
188
|
required: ["symbol", "mdReqID"]
|
|
@@ -196,23 +196,28 @@ var MCPLocal = class {
|
|
|
196
196
|
version: "1.0.0"
|
|
197
197
|
},
|
|
198
198
|
{
|
|
199
|
-
capabilities: {
|
|
199
|
+
capabilities: {
|
|
200
|
+
tools: {},
|
|
201
|
+
prompts: {},
|
|
202
|
+
resources: {}
|
|
203
|
+
}
|
|
200
204
|
}
|
|
201
205
|
);
|
|
202
206
|
transport = new StdioServerTransport();
|
|
203
207
|
onReady = void 0;
|
|
204
208
|
pendingRequests = /* @__PURE__ */ new Map();
|
|
205
209
|
constructor({ logger, onReady }) {
|
|
206
|
-
if (logger
|
|
210
|
+
if (logger && !logger.silent) {
|
|
211
|
+
this.logger = logger;
|
|
212
|
+
}
|
|
207
213
|
if (onReady) this.onReady = onReady;
|
|
208
214
|
}
|
|
209
215
|
async register(parser) {
|
|
210
216
|
this.parser = parser;
|
|
217
|
+
if (parser.logger && !parser.logger.silent) {
|
|
218
|
+
this.logger = parser.logger;
|
|
219
|
+
}
|
|
211
220
|
this.parser.addOnMessageCallback((message) => {
|
|
212
|
-
this.logger?.log({
|
|
213
|
-
level: "info",
|
|
214
|
-
message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`
|
|
215
|
-
});
|
|
216
221
|
const msgType = message.messageType;
|
|
217
222
|
if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {
|
|
218
223
|
const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : message.getField(Fields.ClOrdID);
|
|
@@ -228,7 +233,6 @@ var MCPLocal = class {
|
|
|
228
233
|
}
|
|
229
234
|
}
|
|
230
235
|
});
|
|
231
|
-
this.logger = parser.logger;
|
|
232
236
|
this.addWorkflows();
|
|
233
237
|
await this.server.connect(this.transport);
|
|
234
238
|
if (this.onReady) {
|
|
@@ -314,7 +318,8 @@ var MCPLocal = class {
|
|
|
314
318
|
content: [
|
|
315
319
|
{
|
|
316
320
|
type: "text",
|
|
317
|
-
text:
|
|
321
|
+
text: `${parsedMessage[0].description}
|
|
322
|
+
${parsedMessage[0].messageTypeDescription}`
|
|
318
323
|
}
|
|
319
324
|
]
|
|
320
325
|
};
|
|
@@ -344,7 +349,7 @@ var MCPLocal = class {
|
|
|
344
349
|
content: [
|
|
345
350
|
{
|
|
346
351
|
type: "text",
|
|
347
|
-
text:
|
|
352
|
+
text: `${parsedMessage[0].toFIXJSON()}`
|
|
348
353
|
}
|
|
349
354
|
]
|
|
350
355
|
};
|
|
@@ -548,7 +553,7 @@ var MCPLocal = class {
|
|
|
548
553
|
},
|
|
549
554
|
{
|
|
550
555
|
name: "side",
|
|
551
|
-
description: "Order side (1=Buy, 2=Sell)",
|
|
556
|
+
description: "Order side (1=Buy, 2=Sell, 3=BuyMinus, 4=SellPlus, 5=SellShort, 6=SellShortExempt, 7=Undisclosed, 8=Cross, 9=CrossShort, A=CrossShortExempt, B=AsDefined, C=Opposite, D=Subscribe, E=Redeem, F=Lend, G=Borrow, H=SellUndisclosed)",
|
|
552
557
|
required: true
|
|
553
558
|
},
|
|
554
559
|
{
|
|
@@ -639,15 +644,20 @@ var MCPLocal = class {
|
|
|
639
644
|
text: [
|
|
640
645
|
"Create a New Order Single FIX message with the following parameters:",
|
|
641
646
|
`- ClOrdID: ${clOrdID}`,
|
|
642
|
-
`- HandlInst: ${handlInst ?? "
|
|
647
|
+
`- HandlInst: ${handlInst ?? "3"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Manual, '2' for Automated, '3' for AutomatedNoIntervention)`,
|
|
643
648
|
`- Quantity: ${quantity}`,
|
|
644
649
|
`- Price: ${price}`,
|
|
645
|
-
`- OrdType: ${ordType ?? "
|
|
646
|
-
`- Side: ${side}`,
|
|
650
|
+
`- OrdType: ${ordType ?? "1"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Market, '2' for Limit, '3' for Stop)`,
|
|
651
|
+
`- Side: ${side} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '1' for Buy, '2' for Sell)`,
|
|
647
652
|
`- Symbol: ${symbol}`,
|
|
648
|
-
`- TimeInForce: ${timeInForce ?? "
|
|
653
|
+
`- TimeInForce: ${timeInForce ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Day, '1' for Good Till Cancel, '2' for At Opening, '3' for Immediate or Cancel, '4' for Fill or Kill, '5' for Good Till Crossing, '6' for Good Till Date)`,
|
|
654
|
+
"",
|
|
655
|
+
"Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.",
|
|
649
656
|
"",
|
|
650
|
-
|
|
657
|
+
'Note: For the Side parameter, always use the numeric/alphabetic value (e.g., "1" for Buy, "2" for Sell) as defined in the FIX protocol, not the descriptive name.',
|
|
658
|
+
'Note: For the HandlInst parameter, always use the numeric/alphabetic value (e.g., "1" for Manual, "2" for Automated, "3" for AutomatedNoIntervention) as defined in the FIX protocol, not the descriptive name.',
|
|
659
|
+
'Note: For the OrdType parameter, always use the numeric/alphabetic value (e.g., "1" for Market, "2" for Limit, "3" for Stop) as defined in the FIX protocol, not the descriptive name.',
|
|
660
|
+
'Note: For the TimeInForce parameter, always use the numeric/alphabetic value (e.g., "0" for Day, "1" for Good Till Cancel, "2" for At Opening) as defined in the FIX protocol, not the descriptive name.'
|
|
651
661
|
].join("\n")
|
|
652
662
|
}
|
|
653
663
|
}
|
|
@@ -664,13 +674,17 @@ var MCPLocal = class {
|
|
|
664
674
|
type: "text",
|
|
665
675
|
text: [
|
|
666
676
|
"Create a Market Data Request FIX message with the following parameters:",
|
|
667
|
-
`- MDUpdateType: ${mdUpdateType ?? "
|
|
677
|
+
`- MDUpdateType: ${mdUpdateType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for FullRefresh, '1' for IncrementalRefresh)`,
|
|
668
678
|
`- Symbol: ${symbol}`,
|
|
669
679
|
`- MDReqID: ${mdReqID}`,
|
|
670
|
-
`- SubscriptionRequestType: ${subscriptionRequestType ?? "
|
|
671
|
-
`- MDEntryType: ${mdEntryType ?? "
|
|
680
|
+
`- SubscriptionRequestType: ${subscriptionRequestType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Snapshot + Updates, '1' for Snapshot, '2' for Unsubscribe)`,
|
|
681
|
+
`- MDEntryType: ${mdEntryType ?? "0"} (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use '0' for Bid, '1' for Offer, '2' for Trade, '3' for Index Value, '4' for Opening Price)`,
|
|
682
|
+
"",
|
|
683
|
+
"Format the response as a JSON object with FIX tag numbers as keys and their corresponding values.",
|
|
672
684
|
"",
|
|
673
|
-
|
|
685
|
+
'Note: For the MDUpdateType parameter, always use the numeric/alphabetic value (e.g., "0" for FullRefresh, "1" for IncrementalRefresh) as defined in the FIX protocol, not the descriptive name.',
|
|
686
|
+
'Note: For the SubscriptionRequestType parameter, always use the numeric/alphabetic value (e.g., "0" for Snapshot + Updates, "1" for Snapshot, "2" for Unsubscribe) as defined in the FIX protocol, not the descriptive name.',
|
|
687
|
+
'Note: For the MDEntryType parameter, always use the numeric/alphabetic value (e.g., "0" for Bid, "1" for Offer, "2" for Trade, "3" for Index Value, "4" for Opening Price) as defined in the FIX protocol, not the descriptive name.'
|
|
674
688
|
].join("\n")
|
|
675
689
|
}
|
|
676
690
|
}
|