fixparser-plugin-mcp 9.1.7-71fc8a2b → 9.1.7-8fdb1e41

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.
@@ -8,1277 +8,172 @@ import {
8
8
  ListResourcesRequestSchema,
9
9
  ListToolsRequestSchema
10
10
  } from "@modelcontextprotocol/sdk/types.js";
11
- import { z } from "zod";
12
-
13
- // ../../node_modules/zod-to-json-schema/dist/esm/Options.js
14
- var ignoreOverride = Symbol("Let zodToJsonSchema decide on which parser to use");
15
- var defaultOptions = {
16
- name: void 0,
17
- $refStrategy: "root",
18
- basePath: ["#"],
19
- effectStrategy: "input",
20
- pipeStrategy: "all",
21
- dateStrategy: "format:date-time",
22
- mapStrategy: "entries",
23
- removeAdditionalStrategy: "passthrough",
24
- allowedAdditionalProperties: true,
25
- rejectedAdditionalProperties: false,
26
- definitionPath: "definitions",
27
- target: "jsonSchema7",
28
- strictUnions: false,
29
- definitions: {},
30
- errorMessages: false,
31
- markdownDescription: false,
32
- patternStrategy: "escape",
33
- applyRegexFlags: false,
34
- emailStrategy: "format:email",
35
- base64Strategy: "contentEncoding:base64",
36
- nameStrategy: "ref"
37
- };
38
- var getDefaultOptions = (options) => typeof options === "string" ? {
39
- ...defaultOptions,
40
- name: options
41
- } : {
42
- ...defaultOptions,
43
- ...options
44
- };
45
-
46
- // ../../node_modules/zod-to-json-schema/dist/esm/Refs.js
47
- var getRefs = (options) => {
48
- const _options = getDefaultOptions(options);
49
- const currentPath = _options.name !== void 0 ? [..._options.basePath, _options.definitionPath, _options.name] : _options.basePath;
50
- return {
51
- ..._options,
52
- currentPath,
53
- propertyPath: void 0,
54
- seen: new Map(Object.entries(_options.definitions).map(([name, def]) => [
55
- def._def,
56
- {
57
- def: def._def,
58
- path: [..._options.basePath, _options.definitionPath, name],
59
- // Resolution of references will be forced even though seen, so it's ok that the schema is undefined here for now.
60
- jsonSchema: void 0
61
- }
62
- ]))
63
- };
64
- };
65
-
66
- // ../../node_modules/zod-to-json-schema/dist/esm/errorMessages.js
67
- function addErrorMessage(res, key, errorMessage, refs) {
68
- if (!refs?.errorMessages)
69
- return;
70
- if (errorMessage) {
71
- res.errorMessage = {
72
- ...res.errorMessage,
73
- [key]: errorMessage
74
- };
75
- }
76
- }
77
- function setResponseValueAndErrors(res, key, value, errorMessage, refs) {
78
- res[key] = value;
79
- addErrorMessage(res, key, errorMessage, refs);
80
- }
81
-
82
- // ../../node_modules/zod-to-json-schema/dist/esm/selectParser.js
83
- import { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind3 } from "zod";
84
-
85
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/any.js
86
- function parseAnyDef() {
87
- return {};
88
- }
89
-
90
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/array.js
91
- import { ZodFirstPartyTypeKind } from "zod";
92
- function parseArrayDef(def, refs) {
93
- const res = {
94
- type: "array"
95
- };
96
- if (def.type?._def && def.type?._def?.typeName !== ZodFirstPartyTypeKind.ZodAny) {
97
- res.items = parseDef(def.type._def, {
98
- ...refs,
99
- currentPath: [...refs.currentPath, "items"]
100
- });
101
- }
102
- if (def.minLength) {
103
- setResponseValueAndErrors(res, "minItems", def.minLength.value, def.minLength.message, refs);
104
- }
105
- if (def.maxLength) {
106
- setResponseValueAndErrors(res, "maxItems", def.maxLength.value, def.maxLength.message, refs);
107
- }
108
- if (def.exactLength) {
109
- setResponseValueAndErrors(res, "minItems", def.exactLength.value, def.exactLength.message, refs);
110
- setResponseValueAndErrors(res, "maxItems", def.exactLength.value, def.exactLength.message, refs);
111
- }
112
- return res;
113
- }
114
-
115
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/bigint.js
116
- function parseBigintDef(def, refs) {
117
- const res = {
118
- type: "integer",
119
- format: "int64"
120
- };
121
- if (!def.checks)
122
- return res;
123
- for (const check of def.checks) {
124
- switch (check.kind) {
125
- case "min":
126
- if (refs.target === "jsonSchema7") {
127
- if (check.inclusive) {
128
- setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
129
- } else {
130
- setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
131
- }
132
- } else {
133
- if (!check.inclusive) {
134
- res.exclusiveMinimum = true;
135
- }
136
- setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
137
- }
138
- break;
139
- case "max":
140
- if (refs.target === "jsonSchema7") {
141
- if (check.inclusive) {
142
- setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
143
- } else {
144
- setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
145
- }
146
- } else {
147
- if (!check.inclusive) {
148
- res.exclusiveMaximum = true;
149
- }
150
- setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
151
- }
152
- break;
153
- case "multipleOf":
154
- setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
155
- break;
156
- }
157
- }
158
- return res;
159
- }
160
-
161
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/boolean.js
162
- function parseBooleanDef() {
163
- return {
164
- type: "boolean"
165
- };
166
- }
167
-
168
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/branded.js
169
- function parseBrandedDef(_def, refs) {
170
- return parseDef(_def.type._def, refs);
171
- }
172
-
173
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/catch.js
174
- var parseCatchDef = (def, refs) => {
175
- return parseDef(def.innerType._def, refs);
176
- };
177
-
178
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/date.js
179
- function parseDateDef(def, refs, overrideDateStrategy) {
180
- const strategy = overrideDateStrategy ?? refs.dateStrategy;
181
- if (Array.isArray(strategy)) {
182
- return {
183
- anyOf: strategy.map((item, i) => parseDateDef(def, refs, item))
184
- };
185
- }
186
- switch (strategy) {
187
- case "string":
188
- case "format:date-time":
189
- return {
190
- type: "string",
191
- format: "date-time"
192
- };
193
- case "format:date":
194
- return {
195
- type: "string",
196
- format: "date"
197
- };
198
- case "integer":
199
- return integerDateParser(def, refs);
200
- }
201
- }
202
- var integerDateParser = (def, refs) => {
203
- const res = {
204
- type: "integer",
205
- format: "unix-time"
206
- };
207
- if (refs.target === "openApi3") {
208
- return res;
209
- }
210
- for (const check of def.checks) {
211
- switch (check.kind) {
212
- case "min":
213
- setResponseValueAndErrors(
214
- res,
215
- "minimum",
216
- check.value,
217
- // This is in milliseconds
218
- check.message,
219
- refs
220
- );
221
- break;
222
- case "max":
223
- setResponseValueAndErrors(
224
- res,
225
- "maximum",
226
- check.value,
227
- // This is in milliseconds
228
- check.message,
229
- refs
230
- );
231
- break;
232
- }
233
- }
234
- return res;
235
- };
236
-
237
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/default.js
238
- function parseDefaultDef(_def, refs) {
239
- return {
240
- ...parseDef(_def.innerType._def, refs),
241
- default: _def.defaultValue()
242
- };
243
- }
244
-
245
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/effects.js
246
- function parseEffectsDef(_def, refs) {
247
- return refs.effectStrategy === "input" ? parseDef(_def.schema._def, refs) : {};
248
- }
249
-
250
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/enum.js
251
- function parseEnumDef(def) {
252
- return {
253
- type: "string",
254
- enum: Array.from(def.values)
255
- };
256
- }
257
-
258
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/intersection.js
259
- var isJsonSchema7AllOfType = (type) => {
260
- if ("type" in type && type.type === "string")
261
- return false;
262
- return "allOf" in type;
263
- };
264
- function parseIntersectionDef(def, refs) {
265
- const allOf = [
266
- parseDef(def.left._def, {
267
- ...refs,
268
- currentPath: [...refs.currentPath, "allOf", "0"]
269
- }),
270
- parseDef(def.right._def, {
271
- ...refs,
272
- currentPath: [...refs.currentPath, "allOf", "1"]
273
- })
274
- ].filter((x) => !!x);
275
- let unevaluatedProperties = refs.target === "jsonSchema2019-09" ? { unevaluatedProperties: false } : void 0;
276
- const mergedAllOf = [];
277
- allOf.forEach((schema) => {
278
- if (isJsonSchema7AllOfType(schema)) {
279
- mergedAllOf.push(...schema.allOf);
280
- if (schema.unevaluatedProperties === void 0) {
281
- unevaluatedProperties = void 0;
282
- }
283
- } else {
284
- let nestedSchema = schema;
285
- if ("additionalProperties" in schema && schema.additionalProperties === false) {
286
- const { additionalProperties, ...rest } = schema;
287
- nestedSchema = rest;
288
- } else {
289
- unevaluatedProperties = void 0;
290
- }
291
- mergedAllOf.push(nestedSchema);
292
- }
293
- });
294
- return mergedAllOf.length ? {
295
- allOf: mergedAllOf,
296
- ...unevaluatedProperties
297
- } : void 0;
298
- }
299
-
300
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/literal.js
301
- function parseLiteralDef(def, refs) {
302
- const parsedType = typeof def.value;
303
- if (parsedType !== "bigint" && parsedType !== "number" && parsedType !== "boolean" && parsedType !== "string") {
304
- return {
305
- type: Array.isArray(def.value) ? "array" : "object"
306
- };
307
- }
308
- if (refs.target === "openApi3") {
309
- return {
310
- type: parsedType === "bigint" ? "integer" : parsedType,
311
- enum: [def.value]
312
- };
313
- }
314
- return {
315
- type: parsedType === "bigint" ? "integer" : parsedType,
316
- const: def.value
317
- };
318
- }
319
-
320
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/record.js
321
- import { ZodFirstPartyTypeKind as ZodFirstPartyTypeKind2 } from "zod";
322
-
323
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/string.js
324
- var emojiRegex = void 0;
325
- var zodPatterns = {
326
- /**
327
- * `c` was changed to `[cC]` to replicate /i flag
328
- */
329
- cuid: /^[cC][^\s-]{8,}$/,
330
- cuid2: /^[0-9a-z]+$/,
331
- ulid: /^[0-9A-HJKMNP-TV-Z]{26}$/,
332
- /**
333
- * `a-z` was added to replicate /i flag
334
- */
335
- email: /^(?!\.)(?!.*\.\.)([a-zA-Z0-9_'+\-\.]*)[a-zA-Z0-9_+-]@([a-zA-Z0-9][a-zA-Z0-9\-]*\.)+[a-zA-Z]{2,}$/,
336
- /**
337
- * Constructed a valid Unicode RegExp
338
- *
339
- * Lazily instantiate since this type of regex isn't supported
340
- * in all envs (e.g. React Native).
341
- *
342
- * See:
343
- * https://github.com/colinhacks/zod/issues/2433
344
- * Fix in Zod:
345
- * https://github.com/colinhacks/zod/commit/9340fd51e48576a75adc919bff65dbc4a5d4c99b
346
- */
347
- emoji: () => {
348
- if (emojiRegex === void 0) {
349
- emojiRegex = RegExp("^(\\p{Extended_Pictographic}|\\p{Emoji_Component})+$", "u");
11
+ import { Field, Fields, Messages } from "fixparser";
12
+ var parseInputSchema = {
13
+ type: "object",
14
+ properties: {
15
+ fixString: {
16
+ type: "string",
17
+ description: "FIX message string to parse"
350
18
  }
351
- return emojiRegex;
352
19
  },
353
- /**
354
- * Unused
355
- */
356
- uuid: /^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/,
357
- /**
358
- * Unused
359
- */
360
- ipv4: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/,
361
- ipv4Cidr: /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\/(3[0-2]|[12]?[0-9])$/,
362
- /**
363
- * Unused
364
- */
365
- ipv6: /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,
366
- ipv6Cidr: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/,
367
- base64: /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/,
368
- base64url: /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/,
369
- nanoid: /^[a-zA-Z0-9_-]{21}$/,
370
- jwt: /^[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]*$/
20
+ required: ["fixString"]
371
21
  };
372
- function parseStringDef(def, refs) {
373
- const res = {
374
- type: "string"
375
- };
376
- if (def.checks) {
377
- for (const check of def.checks) {
378
- switch (check.kind) {
379
- case "min":
380
- setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check.value) : check.value, check.message, refs);
381
- break;
382
- case "max":
383
- setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check.value) : check.value, check.message, refs);
384
- break;
385
- case "email":
386
- switch (refs.emailStrategy) {
387
- case "format:email":
388
- addFormat(res, "email", check.message, refs);
389
- break;
390
- case "format:idn-email":
391
- addFormat(res, "idn-email", check.message, refs);
392
- break;
393
- case "pattern:zod":
394
- addPattern(res, zodPatterns.email, check.message, refs);
395
- break;
396
- }
397
- break;
398
- case "url":
399
- addFormat(res, "uri", check.message, refs);
400
- break;
401
- case "uuid":
402
- addFormat(res, "uuid", check.message, refs);
403
- break;
404
- case "regex":
405
- addPattern(res, check.regex, check.message, refs);
406
- break;
407
- case "cuid":
408
- addPattern(res, zodPatterns.cuid, check.message, refs);
409
- break;
410
- case "cuid2":
411
- addPattern(res, zodPatterns.cuid2, check.message, refs);
412
- break;
413
- case "startsWith":
414
- addPattern(res, RegExp(`^${escapeLiteralCheckValue(check.value, refs)}`), check.message, refs);
415
- break;
416
- case "endsWith":
417
- addPattern(res, RegExp(`${escapeLiteralCheckValue(check.value, refs)}$`), check.message, refs);
418
- break;
419
- case "datetime":
420
- addFormat(res, "date-time", check.message, refs);
421
- break;
422
- case "date":
423
- addFormat(res, "date", check.message, refs);
424
- break;
425
- case "time":
426
- addFormat(res, "time", check.message, refs);
427
- break;
428
- case "duration":
429
- addFormat(res, "duration", check.message, refs);
430
- break;
431
- case "length":
432
- setResponseValueAndErrors(res, "minLength", typeof res.minLength === "number" ? Math.max(res.minLength, check.value) : check.value, check.message, refs);
433
- setResponseValueAndErrors(res, "maxLength", typeof res.maxLength === "number" ? Math.min(res.maxLength, check.value) : check.value, check.message, refs);
434
- break;
435
- case "includes": {
436
- addPattern(res, RegExp(escapeLiteralCheckValue(check.value, refs)), check.message, refs);
437
- break;
438
- }
439
- case "ip": {
440
- if (check.version !== "v6") {
441
- addFormat(res, "ipv4", check.message, refs);
442
- }
443
- if (check.version !== "v4") {
444
- addFormat(res, "ipv6", check.message, refs);
445
- }
446
- break;
447
- }
448
- case "base64url":
449
- addPattern(res, zodPatterns.base64url, check.message, refs);
450
- break;
451
- case "jwt":
452
- addPattern(res, zodPatterns.jwt, check.message, refs);
453
- break;
454
- case "cidr": {
455
- if (check.version !== "v6") {
456
- addPattern(res, zodPatterns.ipv4Cidr, check.message, refs);
457
- }
458
- if (check.version !== "v4") {
459
- addPattern(res, zodPatterns.ipv6Cidr, check.message, refs);
460
- }
461
- break;
462
- }
463
- case "emoji":
464
- addPattern(res, zodPatterns.emoji(), check.message, refs);
465
- break;
466
- case "ulid": {
467
- addPattern(res, zodPatterns.ulid, check.message, refs);
468
- break;
469
- }
470
- case "base64": {
471
- switch (refs.base64Strategy) {
472
- case "format:binary": {
473
- addFormat(res, "binary", check.message, refs);
474
- break;
475
- }
476
- case "contentEncoding:base64": {
477
- setResponseValueAndErrors(res, "contentEncoding", "base64", check.message, refs);
478
- break;
479
- }
480
- case "pattern:zod": {
481
- addPattern(res, zodPatterns.base64, check.message, refs);
482
- break;
483
- }
484
- }
485
- break;
486
- }
487
- case "nanoid": {
488
- addPattern(res, zodPatterns.nanoid, check.message, refs);
489
- }
490
- case "toLowerCase":
491
- case "toUpperCase":
492
- case "trim":
493
- break;
494
- default:
495
- /* @__PURE__ */ ((_) => {
496
- })(check);
497
- }
498
- }
499
- }
500
- return res;
501
- }
502
- function escapeLiteralCheckValue(literal, refs) {
503
- return refs.patternStrategy === "escape" ? escapeNonAlphaNumeric(literal) : literal;
504
- }
505
- var ALPHA_NUMERIC = new Set("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz0123456789");
506
- function escapeNonAlphaNumeric(source) {
507
- let result = "";
508
- for (let i = 0; i < source.length; i++) {
509
- if (!ALPHA_NUMERIC.has(source[i])) {
510
- result += "\\";
511
- }
512
- result += source[i];
513
- }
514
- return result;
515
- }
516
- function addFormat(schema, value, message, refs) {
517
- if (schema.format || schema.anyOf?.some((x) => x.format)) {
518
- if (!schema.anyOf) {
519
- schema.anyOf = [];
520
- }
521
- if (schema.format) {
522
- schema.anyOf.push({
523
- format: schema.format,
524
- ...schema.errorMessage && refs.errorMessages && {
525
- errorMessage: { format: schema.errorMessage.format }
526
- }
527
- });
528
- delete schema.format;
529
- if (schema.errorMessage) {
530
- delete schema.errorMessage.format;
531
- if (Object.keys(schema.errorMessage).length === 0) {
532
- delete schema.errorMessage;
533
- }
534
- }
535
- }
536
- schema.anyOf.push({
537
- format: value,
538
- ...message && refs.errorMessages && { errorMessage: { format: message } }
539
- });
540
- } else {
541
- setResponseValueAndErrors(schema, "format", value, message, refs);
542
- }
543
- }
544
- function addPattern(schema, regex, message, refs) {
545
- if (schema.pattern || schema.allOf?.some((x) => x.pattern)) {
546
- if (!schema.allOf) {
547
- schema.allOf = [];
548
- }
549
- if (schema.pattern) {
550
- schema.allOf.push({
551
- pattern: schema.pattern,
552
- ...schema.errorMessage && refs.errorMessages && {
553
- errorMessage: { pattern: schema.errorMessage.pattern }
554
- }
555
- });
556
- delete schema.pattern;
557
- if (schema.errorMessage) {
558
- delete schema.errorMessage.pattern;
559
- if (Object.keys(schema.errorMessage).length === 0) {
560
- delete schema.errorMessage;
561
- }
562
- }
563
- }
564
- schema.allOf.push({
565
- pattern: stringifyRegExpWithFlags(regex, refs),
566
- ...message && refs.errorMessages && { errorMessage: { pattern: message } }
567
- });
568
- } else {
569
- setResponseValueAndErrors(schema, "pattern", stringifyRegExpWithFlags(regex, refs), message, refs);
570
- }
571
- }
572
- function stringifyRegExpWithFlags(regex, refs) {
573
- if (!refs.applyRegexFlags || !regex.flags) {
574
- return regex.source;
575
- }
576
- const flags = {
577
- i: regex.flags.includes("i"),
578
- m: regex.flags.includes("m"),
579
- s: regex.flags.includes("s")
580
- // `.` matches newlines
581
- };
582
- const source = flags.i ? regex.source.toLowerCase() : regex.source;
583
- let pattern = "";
584
- let isEscaped = false;
585
- let inCharGroup = false;
586
- let inCharRange = false;
587
- for (let i = 0; i < source.length; i++) {
588
- if (isEscaped) {
589
- pattern += source[i];
590
- isEscaped = false;
591
- continue;
592
- }
593
- if (flags.i) {
594
- if (inCharGroup) {
595
- if (source[i].match(/[a-z]/)) {
596
- if (inCharRange) {
597
- pattern += source[i];
598
- pattern += `${source[i - 2]}-${source[i]}`.toUpperCase();
599
- inCharRange = false;
600
- } else if (source[i + 1] === "-" && source[i + 2]?.match(/[a-z]/)) {
601
- pattern += source[i];
602
- inCharRange = true;
603
- } else {
604
- pattern += `${source[i]}${source[i].toUpperCase()}`;
605
- }
606
- continue;
607
- }
608
- } else if (source[i].match(/[a-z]/)) {
609
- pattern += `[${source[i]}${source[i].toUpperCase()}]`;
610
- continue;
611
- }
612
- }
613
- if (flags.m) {
614
- if (source[i] === "^") {
615
- pattern += `(^|(?<=[\r
616
- ]))`;
617
- continue;
618
- } else if (source[i] === "$") {
619
- pattern += `($|(?=[\r
620
- ]))`;
621
- continue;
622
- }
623
- }
624
- if (flags.s && source[i] === ".") {
625
- pattern += inCharGroup ? `${source[i]}\r
626
- ` : `[${source[i]}\r
627
- ]`;
628
- continue;
629
- }
630
- pattern += source[i];
631
- if (source[i] === "\\") {
632
- isEscaped = true;
633
- } else if (inCharGroup && source[i] === "]") {
634
- inCharGroup = false;
635
- } else if (!inCharGroup && source[i] === "[") {
636
- inCharGroup = true;
637
- }
638
- }
639
- try {
640
- new RegExp(pattern);
641
- } catch {
642
- console.warn(`Could not convert regex pattern at ${refs.currentPath.join("/")} to a flag-independent form! Falling back to the flag-ignorant source`);
643
- return regex.source;
644
- }
645
- return pattern;
646
- }
647
-
648
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/record.js
649
- function parseRecordDef(def, refs) {
650
- if (refs.target === "openAi") {
651
- console.warn("Warning: OpenAI may not support records in schemas! Try an array of key-value pairs instead.");
652
- }
653
- if (refs.target === "openApi3" && def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodEnum) {
654
- return {
655
- type: "object",
656
- required: def.keyType._def.values,
657
- properties: def.keyType._def.values.reduce((acc, key) => ({
658
- ...acc,
659
- [key]: parseDef(def.valueType._def, {
660
- ...refs,
661
- currentPath: [...refs.currentPath, "properties", key]
662
- }) ?? {}
663
- }), {}),
664
- additionalProperties: refs.rejectedAdditionalProperties
665
- };
666
- }
667
- const schema = {
668
- type: "object",
669
- additionalProperties: parseDef(def.valueType._def, {
670
- ...refs,
671
- currentPath: [...refs.currentPath, "additionalProperties"]
672
- }) ?? refs.allowedAdditionalProperties
673
- };
674
- if (refs.target === "openApi3") {
675
- return schema;
676
- }
677
- if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodString && def.keyType._def.checks?.length) {
678
- const { type, ...keyType } = parseStringDef(def.keyType._def, refs);
679
- return {
680
- ...schema,
681
- propertyNames: keyType
682
- };
683
- } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodEnum) {
684
- return {
685
- ...schema,
686
- propertyNames: {
687
- enum: def.keyType._def.values
688
- }
689
- };
690
- } else if (def.keyType?._def.typeName === ZodFirstPartyTypeKind2.ZodBranded && def.keyType._def.type._def.typeName === ZodFirstPartyTypeKind2.ZodString && def.keyType._def.type._def.checks?.length) {
691
- const { type, ...keyType } = parseBrandedDef(def.keyType._def, refs);
692
- return {
693
- ...schema,
694
- propertyNames: keyType
695
- };
696
- }
697
- return schema;
698
- }
699
-
700
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/map.js
701
- function parseMapDef(def, refs) {
702
- if (refs.mapStrategy === "record") {
703
- return parseRecordDef(def, refs);
704
- }
705
- const keys = parseDef(def.keyType._def, {
706
- ...refs,
707
- currentPath: [...refs.currentPath, "items", "items", "0"]
708
- }) || {};
709
- const values = parseDef(def.valueType._def, {
710
- ...refs,
711
- currentPath: [...refs.currentPath, "items", "items", "1"]
712
- }) || {};
713
- return {
714
- type: "array",
715
- maxItems: 125,
716
- items: {
717
- type: "array",
718
- items: [keys, values],
719
- minItems: 2,
720
- maxItems: 2
721
- }
722
- };
723
- }
724
-
725
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/nativeEnum.js
726
- function parseNativeEnumDef(def) {
727
- const object = def.values;
728
- const actualKeys = Object.keys(def.values).filter((key) => {
729
- return typeof object[object[key]] !== "number";
730
- });
731
- const actualValues = actualKeys.map((key) => object[key]);
732
- const parsedTypes = Array.from(new Set(actualValues.map((values) => typeof values)));
733
- return {
734
- type: parsedTypes.length === 1 ? parsedTypes[0] === "string" ? "string" : "number" : ["string", "number"],
735
- enum: actualValues
736
- };
737
- }
738
-
739
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/never.js
740
- function parseNeverDef() {
741
- return {
742
- not: {}
743
- };
744
- }
745
-
746
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/null.js
747
- function parseNullDef(refs) {
748
- return refs.target === "openApi3" ? {
749
- enum: ["null"],
750
- nullable: true
751
- } : {
752
- type: "null"
753
- };
754
- }
755
-
756
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/union.js
757
- var primitiveMappings = {
758
- ZodString: "string",
759
- ZodNumber: "number",
760
- ZodBigInt: "integer",
761
- ZodBoolean: "boolean",
762
- ZodNull: "null"
763
- };
764
- function parseUnionDef(def, refs) {
765
- if (refs.target === "openApi3")
766
- return asAnyOf(def, refs);
767
- const options = def.options instanceof Map ? Array.from(def.options.values()) : def.options;
768
- if (options.every((x) => x._def.typeName in primitiveMappings && (!x._def.checks || !x._def.checks.length))) {
769
- const types = options.reduce((types2, x) => {
770
- const type = primitiveMappings[x._def.typeName];
771
- return type && !types2.includes(type) ? [...types2, type] : types2;
772
- }, []);
773
- return {
774
- type: types.length > 1 ? types : types[0]
775
- };
776
- } else if (options.every((x) => x._def.typeName === "ZodLiteral" && !x.description)) {
777
- const types = options.reduce((acc, x) => {
778
- const type = typeof x._def.value;
779
- switch (type) {
780
- case "string":
781
- case "number":
782
- case "boolean":
783
- return [...acc, type];
784
- case "bigint":
785
- return [...acc, "integer"];
786
- case "object":
787
- if (x._def.value === null)
788
- return [...acc, "null"];
789
- case "symbol":
790
- case "undefined":
791
- case "function":
792
- default:
793
- return acc;
794
- }
795
- }, []);
796
- if (types.length === options.length) {
797
- const uniqueTypes = types.filter((x, i, a) => a.indexOf(x) === i);
798
- return {
799
- type: uniqueTypes.length > 1 ? uniqueTypes : uniqueTypes[0],
800
- enum: options.reduce((acc, x) => {
801
- return acc.includes(x._def.value) ? acc : [...acc, x._def.value];
802
- }, [])
803
- };
804
- }
805
- } else if (options.every((x) => x._def.typeName === "ZodEnum")) {
806
- return {
22
+ var parseToJSONInputSchema = {
23
+ type: "object",
24
+ properties: {
25
+ fixString: {
807
26
  type: "string",
808
- enum: options.reduce((acc, x) => [
809
- ...acc,
810
- ...x._def.values.filter((x2) => !acc.includes(x2))
811
- ], [])
812
- };
813
- }
814
- return asAnyOf(def, refs);
815
- }
816
- var asAnyOf = (def, refs) => {
817
- const anyOf = (def.options instanceof Map ? Array.from(def.options.values()) : def.options).map((x, i) => parseDef(x._def, {
818
- ...refs,
819
- currentPath: [...refs.currentPath, "anyOf", `${i}`]
820
- })).filter((x) => !!x && (!refs.strictUnions || typeof x === "object" && Object.keys(x).length > 0));
821
- return anyOf.length ? { anyOf } : void 0;
822
- };
823
-
824
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/nullable.js
825
- function parseNullableDef(def, refs) {
826
- if (["ZodString", "ZodNumber", "ZodBigInt", "ZodBoolean", "ZodNull"].includes(def.innerType._def.typeName) && (!def.innerType._def.checks || !def.innerType._def.checks.length)) {
827
- if (refs.target === "openApi3") {
828
- return {
829
- type: primitiveMappings[def.innerType._def.typeName],
830
- nullable: true
831
- };
832
- }
833
- return {
834
- type: [
835
- primitiveMappings[def.innerType._def.typeName],
836
- "null"
837
- ]
838
- };
839
- }
840
- if (refs.target === "openApi3") {
841
- const base2 = parseDef(def.innerType._def, {
842
- ...refs,
843
- currentPath: [...refs.currentPath]
844
- });
845
- if (base2 && "$ref" in base2)
846
- return { allOf: [base2], nullable: true };
847
- return base2 && { ...base2, nullable: true };
848
- }
849
- const base = parseDef(def.innerType._def, {
850
- ...refs,
851
- currentPath: [...refs.currentPath, "anyOf", "0"]
852
- });
853
- return base && { anyOf: [base, { type: "null" }] };
854
- }
855
-
856
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/number.js
857
- function parseNumberDef(def, refs) {
858
- const res = {
859
- type: "number"
860
- };
861
- if (!def.checks)
862
- return res;
863
- for (const check of def.checks) {
864
- switch (check.kind) {
865
- case "int":
866
- res.type = "integer";
867
- addErrorMessage(res, "type", check.message, refs);
868
- break;
869
- case "min":
870
- if (refs.target === "jsonSchema7") {
871
- if (check.inclusive) {
872
- setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
873
- } else {
874
- setResponseValueAndErrors(res, "exclusiveMinimum", check.value, check.message, refs);
875
- }
876
- } else {
877
- if (!check.inclusive) {
878
- res.exclusiveMinimum = true;
879
- }
880
- setResponseValueAndErrors(res, "minimum", check.value, check.message, refs);
881
- }
882
- break;
883
- case "max":
884
- if (refs.target === "jsonSchema7") {
885
- if (check.inclusive) {
886
- setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
887
- } else {
888
- setResponseValueAndErrors(res, "exclusiveMaximum", check.value, check.message, refs);
889
- }
890
- } else {
891
- if (!check.inclusive) {
892
- res.exclusiveMaximum = true;
893
- }
894
- setResponseValueAndErrors(res, "maximum", check.value, check.message, refs);
895
- }
896
- break;
897
- case "multipleOf":
898
- setResponseValueAndErrors(res, "multipleOf", check.value, check.message, refs);
899
- break;
900
- }
901
- }
902
- return res;
903
- }
904
-
905
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/object.js
906
- import { ZodOptional } from "zod";
907
- function parseObjectDef(def, refs) {
908
- const forceOptionalIntoNullable = refs.target === "openAi";
909
- const result = {
910
- type: "object",
911
- properties: {}
912
- };
913
- const required = [];
914
- const shape = def.shape();
915
- for (const propName in shape) {
916
- let propDef = shape[propName];
917
- if (propDef === void 0 || propDef._def === void 0) {
918
- continue;
919
- }
920
- let propOptional = safeIsOptional(propDef);
921
- if (propOptional && forceOptionalIntoNullable) {
922
- if (propDef instanceof ZodOptional) {
923
- propDef = propDef._def.innerType;
924
- }
925
- if (!propDef.isNullable()) {
926
- propDef = propDef.nullable();
927
- }
928
- propOptional = false;
929
- }
930
- const parsedDef = parseDef(propDef._def, {
931
- ...refs,
932
- currentPath: [...refs.currentPath, "properties", propName],
933
- propertyPath: [...refs.currentPath, "properties", propName]
934
- });
935
- if (parsedDef === void 0) {
936
- continue;
937
- }
938
- result.properties[propName] = parsedDef;
939
- if (!propOptional) {
940
- required.push(propName);
941
- }
942
- }
943
- if (required.length) {
944
- result.required = required;
945
- }
946
- const additionalProperties = decideAdditionalProperties(def, refs);
947
- if (additionalProperties !== void 0) {
948
- result.additionalProperties = additionalProperties;
949
- }
950
- return result;
951
- }
952
- function decideAdditionalProperties(def, refs) {
953
- if (def.catchall._def.typeName !== "ZodNever") {
954
- return parseDef(def.catchall._def, {
955
- ...refs,
956
- currentPath: [...refs.currentPath, "additionalProperties"]
957
- });
958
- }
959
- switch (def.unknownKeys) {
960
- case "passthrough":
961
- return refs.allowedAdditionalProperties;
962
- case "strict":
963
- return refs.rejectedAdditionalProperties;
964
- case "strip":
965
- return refs.removeAdditionalStrategy === "strict" ? refs.allowedAdditionalProperties : refs.rejectedAdditionalProperties;
966
- }
967
- }
968
- function safeIsOptional(schema) {
969
- try {
970
- return schema.isOptional();
971
- } catch {
972
- return true;
973
- }
974
- }
975
-
976
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/optional.js
977
- var parseOptionalDef = (def, refs) => {
978
- if (refs.currentPath.toString() === refs.propertyPath?.toString()) {
979
- return parseDef(def.innerType._def, refs);
980
- }
981
- const innerSchema = parseDef(def.innerType._def, {
982
- ...refs,
983
- currentPath: [...refs.currentPath, "anyOf", "1"]
984
- });
985
- return innerSchema ? {
986
- anyOf: [
987
- {
988
- not: {}
989
- },
990
- innerSchema
991
- ]
992
- } : {};
993
- };
994
-
995
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/pipeline.js
996
- var parsePipelineDef = (def, refs) => {
997
- if (refs.pipeStrategy === "input") {
998
- return parseDef(def.in._def, refs);
999
- } else if (refs.pipeStrategy === "output") {
1000
- return parseDef(def.out._def, refs);
1001
- }
1002
- const a = parseDef(def.in._def, {
1003
- ...refs,
1004
- currentPath: [...refs.currentPath, "allOf", "0"]
1005
- });
1006
- const b = parseDef(def.out._def, {
1007
- ...refs,
1008
- currentPath: [...refs.currentPath, "allOf", a ? "1" : "0"]
1009
- });
1010
- return {
1011
- allOf: [a, b].filter((x) => x !== void 0)
1012
- };
1013
- };
1014
-
1015
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/promise.js
1016
- function parsePromiseDef(def, refs) {
1017
- return parseDef(def.type._def, refs);
1018
- }
1019
-
1020
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/set.js
1021
- function parseSetDef(def, refs) {
1022
- const items = parseDef(def.valueType._def, {
1023
- ...refs,
1024
- currentPath: [...refs.currentPath, "items"]
1025
- });
1026
- const schema = {
1027
- type: "array",
1028
- uniqueItems: true,
1029
- items
1030
- };
1031
- if (def.minSize) {
1032
- setResponseValueAndErrors(schema, "minItems", def.minSize.value, def.minSize.message, refs);
1033
- }
1034
- if (def.maxSize) {
1035
- setResponseValueAndErrors(schema, "maxItems", def.maxSize.value, def.maxSize.message, refs);
1036
- }
1037
- return schema;
1038
- }
1039
-
1040
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/tuple.js
1041
- function parseTupleDef(def, refs) {
1042
- if (def.rest) {
1043
- return {
1044
- type: "array",
1045
- minItems: def.items.length,
1046
- items: def.items.map((x, i) => parseDef(x._def, {
1047
- ...refs,
1048
- currentPath: [...refs.currentPath, "items", `${i}`]
1049
- })).reduce((acc, x) => x === void 0 ? acc : [...acc, x], []),
1050
- additionalItems: parseDef(def.rest._def, {
1051
- ...refs,
1052
- currentPath: [...refs.currentPath, "additionalItems"]
1053
- })
1054
- };
1055
- } else {
1056
- return {
1057
- type: "array",
1058
- minItems: def.items.length,
1059
- maxItems: def.items.length,
1060
- items: def.items.map((x, i) => parseDef(x._def, {
1061
- ...refs,
1062
- currentPath: [...refs.currentPath, "items", `${i}`]
1063
- })).reduce((acc, x) => x === void 0 ? acc : [...acc, x], [])
1064
- };
1065
- }
1066
- }
1067
-
1068
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/undefined.js
1069
- function parseUndefinedDef() {
1070
- return {
1071
- not: {}
1072
- };
1073
- }
1074
-
1075
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/unknown.js
1076
- function parseUnknownDef() {
1077
- return {};
1078
- }
1079
-
1080
- // ../../node_modules/zod-to-json-schema/dist/esm/parsers/readonly.js
1081
- var parseReadonlyDef = (def, refs) => {
1082
- return parseDef(def.innerType._def, refs);
1083
- };
1084
-
1085
- // ../../node_modules/zod-to-json-schema/dist/esm/selectParser.js
1086
- var selectParser = (def, typeName, refs) => {
1087
- switch (typeName) {
1088
- case ZodFirstPartyTypeKind3.ZodString:
1089
- return parseStringDef(def, refs);
1090
- case ZodFirstPartyTypeKind3.ZodNumber:
1091
- return parseNumberDef(def, refs);
1092
- case ZodFirstPartyTypeKind3.ZodObject:
1093
- return parseObjectDef(def, refs);
1094
- case ZodFirstPartyTypeKind3.ZodBigInt:
1095
- return parseBigintDef(def, refs);
1096
- case ZodFirstPartyTypeKind3.ZodBoolean:
1097
- return parseBooleanDef();
1098
- case ZodFirstPartyTypeKind3.ZodDate:
1099
- return parseDateDef(def, refs);
1100
- case ZodFirstPartyTypeKind3.ZodUndefined:
1101
- return parseUndefinedDef();
1102
- case ZodFirstPartyTypeKind3.ZodNull:
1103
- return parseNullDef(refs);
1104
- case ZodFirstPartyTypeKind3.ZodArray:
1105
- return parseArrayDef(def, refs);
1106
- case ZodFirstPartyTypeKind3.ZodUnion:
1107
- case ZodFirstPartyTypeKind3.ZodDiscriminatedUnion:
1108
- return parseUnionDef(def, refs);
1109
- case ZodFirstPartyTypeKind3.ZodIntersection:
1110
- return parseIntersectionDef(def, refs);
1111
- case ZodFirstPartyTypeKind3.ZodTuple:
1112
- return parseTupleDef(def, refs);
1113
- case ZodFirstPartyTypeKind3.ZodRecord:
1114
- return parseRecordDef(def, refs);
1115
- case ZodFirstPartyTypeKind3.ZodLiteral:
1116
- return parseLiteralDef(def, refs);
1117
- case ZodFirstPartyTypeKind3.ZodEnum:
1118
- return parseEnumDef(def);
1119
- case ZodFirstPartyTypeKind3.ZodNativeEnum:
1120
- return parseNativeEnumDef(def);
1121
- case ZodFirstPartyTypeKind3.ZodNullable:
1122
- return parseNullableDef(def, refs);
1123
- case ZodFirstPartyTypeKind3.ZodOptional:
1124
- return parseOptionalDef(def, refs);
1125
- case ZodFirstPartyTypeKind3.ZodMap:
1126
- return parseMapDef(def, refs);
1127
- case ZodFirstPartyTypeKind3.ZodSet:
1128
- return parseSetDef(def, refs);
1129
- case ZodFirstPartyTypeKind3.ZodLazy:
1130
- return () => def.getter()._def;
1131
- case ZodFirstPartyTypeKind3.ZodPromise:
1132
- return parsePromiseDef(def, refs);
1133
- case ZodFirstPartyTypeKind3.ZodNaN:
1134
- case ZodFirstPartyTypeKind3.ZodNever:
1135
- return parseNeverDef();
1136
- case ZodFirstPartyTypeKind3.ZodEffects:
1137
- return parseEffectsDef(def, refs);
1138
- case ZodFirstPartyTypeKind3.ZodAny:
1139
- return parseAnyDef();
1140
- case ZodFirstPartyTypeKind3.ZodUnknown:
1141
- return parseUnknownDef();
1142
- case ZodFirstPartyTypeKind3.ZodDefault:
1143
- return parseDefaultDef(def, refs);
1144
- case ZodFirstPartyTypeKind3.ZodBranded:
1145
- return parseBrandedDef(def, refs);
1146
- case ZodFirstPartyTypeKind3.ZodReadonly:
1147
- return parseReadonlyDef(def, refs);
1148
- case ZodFirstPartyTypeKind3.ZodCatch:
1149
- return parseCatchDef(def, refs);
1150
- case ZodFirstPartyTypeKind3.ZodPipeline:
1151
- return parsePipelineDef(def, refs);
1152
- case ZodFirstPartyTypeKind3.ZodFunction:
1153
- case ZodFirstPartyTypeKind3.ZodVoid:
1154
- case ZodFirstPartyTypeKind3.ZodSymbol:
1155
- return void 0;
1156
- default:
1157
- return /* @__PURE__ */ ((_) => void 0)(typeName);
1158
- }
1159
- };
1160
-
1161
- // ../../node_modules/zod-to-json-schema/dist/esm/parseDef.js
1162
- function parseDef(def, refs, forceResolution = false) {
1163
- const seenItem = refs.seen.get(def);
1164
- if (refs.override) {
1165
- const overrideResult = refs.override?.(def, refs, seenItem, forceResolution);
1166
- if (overrideResult !== ignoreOverride) {
1167
- return overrideResult;
1168
- }
1169
- }
1170
- if (seenItem && !forceResolution) {
1171
- const seenSchema = get$ref(seenItem, refs);
1172
- if (seenSchema !== void 0) {
1173
- return seenSchema;
1174
- }
1175
- }
1176
- const newItem = { def, path: refs.currentPath, jsonSchema: void 0 };
1177
- refs.seen.set(def, newItem);
1178
- const jsonSchemaOrGetter = selectParser(def, def.typeName, refs);
1179
- const jsonSchema = typeof jsonSchemaOrGetter === "function" ? parseDef(jsonSchemaOrGetter(), refs) : jsonSchemaOrGetter;
1180
- if (jsonSchema) {
1181
- addMeta(def, refs, jsonSchema);
1182
- }
1183
- if (refs.postProcess) {
1184
- const postProcessResult = refs.postProcess(jsonSchema, def, refs);
1185
- newItem.jsonSchema = jsonSchema;
1186
- return postProcessResult;
1187
- }
1188
- newItem.jsonSchema = jsonSchema;
1189
- return jsonSchema;
1190
- }
1191
- var get$ref = (item, refs) => {
1192
- switch (refs.$refStrategy) {
1193
- case "root":
1194
- return { $ref: item.path.join("/") };
1195
- case "relative":
1196
- return { $ref: getRelativePath(refs.currentPath, item.path) };
1197
- case "none":
1198
- case "seen": {
1199
- if (item.path.length < refs.currentPath.length && item.path.every((value, index) => refs.currentPath[index] === value)) {
1200
- console.warn(`Recursive reference detected at ${refs.currentPath.join("/")}! Defaulting to any`);
1201
- return {};
1202
- }
1203
- return refs.$refStrategy === "seen" ? {} : void 0;
27
+ description: "FIX message string to parse"
1204
28
  }
1205
- }
1206
- };
1207
- var getRelativePath = (pathA, pathB) => {
1208
- let i = 0;
1209
- for (; i < pathA.length && i < pathB.length; i++) {
1210
- if (pathA[i] !== pathB[i])
1211
- break;
1212
- }
1213
- return [(pathA.length - i).toString(), ...pathB.slice(i)].join("/");
29
+ },
30
+ required: ["fixString"]
1214
31
  };
1215
- var addMeta = (def, refs, jsonSchema) => {
1216
- if (def.description) {
1217
- jsonSchema.description = def.description;
1218
- if (refs.markdownDescription) {
1219
- jsonSchema.markdownDescription = def.description;
32
+ var orderSchema = {
33
+ type: "object",
34
+ properties: {
35
+ clOrdID: {
36
+ type: "string",
37
+ description: "Client Order ID"
38
+ },
39
+ handlInst: {
40
+ type: "string",
41
+ enum: ["1", "2", "3"],
42
+ description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)"
43
+ },
44
+ quantity: {
45
+ type: "number",
46
+ description: "Order quantity"
47
+ },
48
+ price: {
49
+ type: "number",
50
+ description: "Order price"
51
+ },
52
+ ordType: {
53
+ type: "string",
54
+ enum: [
55
+ "1",
56
+ "2",
57
+ "3",
58
+ "4",
59
+ "5",
60
+ "6",
61
+ "7",
62
+ "8",
63
+ "9",
64
+ "A",
65
+ "B",
66
+ "C",
67
+ "D",
68
+ "E",
69
+ "F",
70
+ "G",
71
+ "H",
72
+ "I",
73
+ "J",
74
+ "K",
75
+ "L",
76
+ "M",
77
+ "P",
78
+ "Q",
79
+ "R",
80
+ "S"
81
+ ],
82
+ description: "Order type (1=Market, 2=Limit, 3=Stop)"
83
+ },
84
+ side: {
85
+ type: "string",
86
+ enum: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H"],
87
+ 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)"
88
+ },
89
+ symbol: {
90
+ type: "string",
91
+ description: "Trading symbol"
92
+ },
93
+ timeInForce: {
94
+ type: "string",
95
+ enum: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"],
96
+ description: "Time in force (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)"
1220
97
  }
1221
- }
1222
- return jsonSchema;
98
+ },
99
+ required: ["clOrdID", "handlInst", "quantity", "price", "ordType", "side", "symbol", "timeInForce"]
1223
100
  };
1224
-
1225
- // ../../node_modules/zod-to-json-schema/dist/esm/zodToJsonSchema.js
1226
- var zodToJsonSchema = (schema, options) => {
1227
- const refs = getRefs(options);
1228
- const definitions = typeof options === "object" && options.definitions ? Object.entries(options.definitions).reduce((acc, [name2, schema2]) => ({
1229
- ...acc,
1230
- [name2]: parseDef(schema2._def, {
1231
- ...refs,
1232
- currentPath: [...refs.basePath, refs.definitionPath, name2]
1233
- }, true) ?? {}
1234
- }), {}) : void 0;
1235
- const name = typeof options === "string" ? options : options?.nameStrategy === "title" ? void 0 : options?.name;
1236
- const main = parseDef(schema._def, name === void 0 ? refs : {
1237
- ...refs,
1238
- currentPath: [...refs.basePath, refs.definitionPath, name]
1239
- }, false) ?? {};
1240
- const title = typeof options === "object" && options.name !== void 0 && options.nameStrategy === "title" ? options.name : void 0;
1241
- if (title !== void 0) {
1242
- main.title = title;
1243
- }
1244
- const combined = name === void 0 ? definitions ? {
1245
- ...main,
1246
- [refs.definitionPath]: definitions
1247
- } : main : {
1248
- $ref: [
1249
- ...refs.$refStrategy === "relative" ? [] : refs.basePath,
1250
- refs.definitionPath,
1251
- name
1252
- ].join("/"),
1253
- [refs.definitionPath]: {
1254
- ...definitions,
1255
- [name]: main
101
+ var marketDataRequestInputSchema = {
102
+ type: "object",
103
+ properties: {
104
+ mdUpdateType: {
105
+ type: "string",
106
+ enum: ["0", "1"],
107
+ description: 'Market data update type (IMPORTANT: Use the numeric/alphabetic value, not the descriptive name. For example, use "0" for FullRefresh, "1" for IncrementalRefresh)'
108
+ },
109
+ symbol: {
110
+ type: "string",
111
+ description: "Trading symbol"
112
+ },
113
+ mdReqID: {
114
+ type: "string",
115
+ description: "Market data request ID"
116
+ },
117
+ subscriptionRequestType: {
118
+ type: "string",
119
+ enum: ["0", "1", "2"],
120
+ 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)'
121
+ },
122
+ mdEntryType: {
123
+ type: "string",
124
+ enum: [
125
+ "0",
126
+ "1",
127
+ "2",
128
+ "3",
129
+ "4",
130
+ "5",
131
+ "6",
132
+ "7",
133
+ "8",
134
+ "9",
135
+ "A",
136
+ "B",
137
+ "C",
138
+ "D",
139
+ "E",
140
+ "F",
141
+ "G",
142
+ "H",
143
+ "J",
144
+ "K",
145
+ "L",
146
+ "M",
147
+ "N",
148
+ "O",
149
+ "P",
150
+ "Q",
151
+ "S",
152
+ "R",
153
+ "T",
154
+ "U",
155
+ "V",
156
+ "W",
157
+ "X",
158
+ "Y",
159
+ "Z",
160
+ "a",
161
+ "b",
162
+ "c",
163
+ "d",
164
+ "e",
165
+ "g",
166
+ "h",
167
+ "i",
168
+ "t"
169
+ ],
170
+ 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)'
1256
171
  }
1257
- };
1258
- if (refs.target === "jsonSchema7") {
1259
- combined.$schema = "http://json-schema.org/draft-07/schema#";
1260
- } else if (refs.target === "jsonSchema2019-09" || refs.target === "openAi") {
1261
- combined.$schema = "https://json-schema.org/draft/2019-09/schema#";
1262
- }
1263
- if (refs.target === "openAi" && ("anyOf" in combined || "oneOf" in combined || "allOf" in combined || "type" in combined && Array.isArray(combined.type))) {
1264
- console.warn("Warning: OpenAI may not support schemas with unions as roots! Try wrapping it in an object property.");
1265
- }
1266
- return combined;
172
+ },
173
+ required: ["symbol", "mdReqID"]
1267
174
  };
1268
-
1269
- // src/MCPLocal.ts
1270
- import {
1271
- Field,
1272
- Fields,
1273
- HandlInst,
1274
- MDEntryType,
1275
- Messages,
1276
- OrdType,
1277
- SubscriptionRequestType,
1278
- TimeInForce
1279
- } from "fixparser";
1280
175
  var MCPLocal = class {
1281
- logger;
176
+ // private logger: Logger | undefined;
1282
177
  parser;
1283
178
  server = new Server(
1284
179
  {
@@ -1296,33 +191,35 @@ var MCPLocal = class {
1296
191
  transport = new StdioServerTransport();
1297
192
  onReady = void 0;
1298
193
  pendingRequests = /* @__PURE__ */ new Map();
194
+ verifiedOrders = /* @__PURE__ */ new Map();
1299
195
  constructor({ logger, onReady }) {
1300
- if (logger) this.logger = logger;
1301
196
  if (onReady) this.onReady = onReady;
1302
197
  }
1303
198
  async register(parser) {
1304
199
  this.parser = parser;
1305
200
  this.parser.addOnMessageCallback((message) => {
1306
- this.logger?.log({
1307
- level: "info",
1308
- message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`
1309
- });
1310
201
  const msgType = message.messageType;
1311
- if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {
1312
- const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : message.getField(Fields.ClOrdID);
1313
- if (idField) {
1314
- const id = idField.value;
1315
- if (typeof id === "string" || typeof id === "number") {
1316
- const callback = this.pendingRequests.get(String(id));
1317
- if (callback) {
1318
- callback(message);
1319
- this.pendingRequests.delete(String(id));
1320
- }
202
+ if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport || msgType === Messages.Reject) {
203
+ let id;
204
+ if (msgType === Messages.MarketDataSnapshotFullRefresh) {
205
+ const mdReqID = message.getField(Fields.MDReqID);
206
+ if (mdReqID) id = String(mdReqID.value);
207
+ } else if (msgType === Messages.ExecutionReport) {
208
+ const clOrdID = message.getField(Fields.ClOrdID);
209
+ if (clOrdID) id = String(clOrdID.value);
210
+ } else if (msgType === Messages.Reject) {
211
+ const refSeqNum = message.getField(Fields.RefSeqNum);
212
+ if (refSeqNum) id = String(refSeqNum.value);
213
+ }
214
+ if (id) {
215
+ const callback = this.pendingRequests.get(id);
216
+ if (callback) {
217
+ callback(message);
218
+ this.pendingRequests.delete(id);
1321
219
  }
1322
220
  }
1323
221
  }
1324
222
  });
1325
- this.logger = parser.logger;
1326
223
  this.addWorkflows();
1327
224
  await this.server.connect(this.transport);
1328
225
  if (this.onReady) {
@@ -1331,19 +228,27 @@ var MCPLocal = class {
1331
228
  }
1332
229
  addWorkflows() {
1333
230
  if (!this.parser) {
1334
- this.logger?.log({
1335
- level: "error",
1336
- message: "FIXParser (MCP): -- FIXParser instance not initialized. Ignoring setup of workflows..."
1337
- });
1338
231
  return;
1339
232
  }
1340
233
  if (!this.server) {
1341
- this.logger?.log({
1342
- level: "error",
1343
- message: "FIXParser (MCP): -- MCP Server not initialized. Ignoring setup of workflows..."
1344
- });
1345
234
  return;
1346
235
  }
236
+ const validateArgs = (args, schema) => {
237
+ const result = {};
238
+ for (const [key, propSchema] of Object.entries(schema.properties || {})) {
239
+ const prop = propSchema;
240
+ const value = args?.[key];
241
+ if (prop.required && (value === void 0 || value === null)) {
242
+ throw new Error(`Required property '${key}' is missing`);
243
+ }
244
+ if (value !== void 0) {
245
+ result[key] = value;
246
+ } else if (prop.default !== void 0) {
247
+ result[key] = prop.default;
248
+ }
249
+ }
250
+ return result;
251
+ };
1347
252
  this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
1348
253
  return {
1349
254
  resources: []
@@ -1355,143 +260,27 @@ var MCPLocal = class {
1355
260
  {
1356
261
  name: "parse",
1357
262
  description: "Parses a FIX message and describes it in plain language",
1358
- inputSchema: zodToJsonSchema(
1359
- z.object({
1360
- fixString: z.string().describe("FIX message string to parse")
1361
- }),
1362
- { name: "ParseInput" }
1363
- )
263
+ inputSchema: parseInputSchema
1364
264
  },
1365
265
  {
1366
266
  name: "parseToJSON",
1367
267
  description: "Parses a FIX message into JSON",
1368
- inputSchema: zodToJsonSchema(
1369
- z.object({
1370
- fixString: z.string().describe("FIX message string to parse")
1371
- }),
1372
- { name: "ParseToJSONInput" }
1373
- )
268
+ inputSchema: parseToJSONInputSchema
269
+ },
270
+ {
271
+ name: "verifyOrder",
272
+ description: "Verifies all parameters for a New Order Single. This is the first step - verification only, no order is sent.",
273
+ inputSchema: orderSchema
1374
274
  },
1375
275
  {
1376
- name: "newOrderSingle",
1377
- description: "Creates and sends a New Order Single",
1378
- inputSchema: zodToJsonSchema(
1379
- z.object({
1380
- clOrdID: z.string().describe("Client Order ID"),
1381
- handlInst: z.enum(["1", "2", "3"]).default(HandlInst.AutomatedExecutionNoIntervention).optional().describe("Handling instruction"),
1382
- quantity: z.number().describe("Order quantity"),
1383
- price: z.number().describe("Order price"),
1384
- ordType: z.enum([
1385
- "1",
1386
- "2",
1387
- "3",
1388
- "4",
1389
- "5",
1390
- "6",
1391
- "7",
1392
- "8",
1393
- "9",
1394
- "A",
1395
- "B",
1396
- "C",
1397
- "D",
1398
- "E",
1399
- "F",
1400
- "G",
1401
- "H",
1402
- "I",
1403
- "J",
1404
- "K",
1405
- "L",
1406
- "M",
1407
- "P",
1408
- "Q",
1409
- "R",
1410
- "S"
1411
- ]).default("1").optional().describe("Order type"),
1412
- side: z.enum([
1413
- "1",
1414
- "2",
1415
- "3",
1416
- "4",
1417
- "5",
1418
- "6",
1419
- "7",
1420
- "8",
1421
- "9",
1422
- "A",
1423
- "B",
1424
- "C",
1425
- "D",
1426
- "E",
1427
- "F",
1428
- "G",
1429
- "H"
1430
- ]).describe("Order side (1=Buy, 2=Sell)"),
1431
- symbol: z.string().describe("Trading symbol"),
1432
- timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
1433
- }),
1434
- { name: "NewOrderSingleInput" }
1435
- )
276
+ name: "executeOrder",
277
+ description: "Executes a New Order Single after verification. This is the second step - only call after successful verification.",
278
+ inputSchema: orderSchema
1436
279
  },
1437
280
  {
1438
281
  name: "marketDataRequest",
1439
- description: "Sends a request for Market Data with the given symbol",
1440
- inputSchema: zodToJsonSchema(
1441
- z.object({
1442
- mdUpdateType: z.enum(["0", "1"]).default("0").optional().describe("Market data update type"),
1443
- symbol: z.string().describe("Trading symbol"),
1444
- mdReqID: z.string().describe("Market data request ID"),
1445
- subscriptionRequestType: z.enum(["0", "1", "2"]).default(SubscriptionRequestType.SnapshotAndUpdates).optional().describe("Subscription request type"),
1446
- mdEntryType: z.enum([
1447
- "0",
1448
- "1",
1449
- "2",
1450
- "3",
1451
- "4",
1452
- "5",
1453
- "6",
1454
- "7",
1455
- "8",
1456
- "9",
1457
- "A",
1458
- "B",
1459
- "C",
1460
- "D",
1461
- "E",
1462
- "F",
1463
- "G",
1464
- "H",
1465
- "J",
1466
- "K",
1467
- "L",
1468
- "M",
1469
- "N",
1470
- "O",
1471
- "P",
1472
- "Q",
1473
- "S",
1474
- "R",
1475
- "T",
1476
- "U",
1477
- "V",
1478
- "W",
1479
- "X",
1480
- "Y",
1481
- "Z",
1482
- "a",
1483
- "b",
1484
- "c",
1485
- "d",
1486
- "e",
1487
- "g",
1488
- "h",
1489
- "i",
1490
- "t"
1491
- ]).default(MDEntryType.Bid).optional().describe("Market data entry type")
1492
- }),
1493
- { name: "MarketDataRequestInput" }
1494
- )
282
+ description: "Sends a request for Market Data with the given symbol. IMPORTANT: All parameters must be explicitly provided by the user - no assumptions will be made.",
283
+ inputSchema: marketDataRequestInputSchema
1495
284
  }
1496
285
  ]
1497
286
  };
@@ -1500,10 +289,8 @@ var MCPLocal = class {
1500
289
  const { name, arguments: args } = request.params;
1501
290
  switch (name) {
1502
291
  case "parse": {
1503
- const { fixString } = z.object({
1504
- fixString: z.string().describe("FIX message string to parse")
1505
- }).parse(args || {});
1506
292
  try {
293
+ const { fixString } = validateArgs(args, parseInputSchema);
1507
294
  const parsedMessage = this.parser?.parse(fixString);
1508
295
  if (!parsedMessage || parsedMessage.length === 0) {
1509
296
  return {
@@ -1515,7 +302,8 @@ var MCPLocal = class {
1515
302
  content: [
1516
303
  {
1517
304
  type: "text",
1518
- text: `Parsed FIX message: ${fixString} (placeholder implementation)`
305
+ text: `${parsedMessage[0].description}
306
+ ${parsedMessage[0].messageTypeDescription}`
1519
307
  }
1520
308
  ]
1521
309
  };
@@ -1525,17 +313,15 @@ var MCPLocal = class {
1525
313
  content: [
1526
314
  {
1527
315
  type: "text",
1528
- text: "Error: Failed to parse FIX string"
316
+ text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
1529
317
  }
1530
318
  ]
1531
319
  };
1532
320
  }
1533
321
  }
1534
322
  case "parseToJSON": {
1535
- const { fixString } = z.object({
1536
- fixString: z.string().describe("FIX message string to parse")
1537
- }).parse(args || {});
1538
323
  try {
324
+ const { fixString } = validateArgs(args, parseToJSONInputSchema);
1539
325
  const parsedMessage = this.parser?.parse(fixString);
1540
326
  if (!parsedMessage || parsedMessage.length === 0) {
1541
327
  return {
@@ -1547,7 +333,7 @@ var MCPLocal = class {
1547
333
  content: [
1548
334
  {
1549
335
  type: "text",
1550
- text: JSON.stringify({ fixString, parsed: "placeholder" })
336
+ text: `${parsedMessage[0].toFIXJSON()}`
1551
337
  }
1552
338
  ]
1553
339
  };
@@ -1557,217 +343,192 @@ var MCPLocal = class {
1557
343
  content: [
1558
344
  {
1559
345
  type: "text",
1560
- text: "Error: Failed to parse FIX string"
346
+ text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
1561
347
  }
1562
348
  ]
1563
349
  };
1564
350
  }
1565
351
  }
1566
- case "newOrderSingle": {
1567
- const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = z.object({
1568
- clOrdID: z.string().describe("Client Order ID"),
1569
- handlInst: z.enum(["1", "2", "3"]).default(HandlInst.AutomatedExecutionNoIntervention).optional().describe("Handling instruction"),
1570
- quantity: z.number().describe("Order quantity"),
1571
- price: z.number().describe("Order price"),
1572
- ordType: z.enum([
1573
- "1",
1574
- "2",
1575
- "3",
1576
- "4",
1577
- "5",
1578
- "6",
1579
- "7",
1580
- "8",
1581
- "9",
1582
- "A",
1583
- "B",
1584
- "C",
1585
- "D",
1586
- "E",
1587
- "F",
1588
- "G",
1589
- "H",
1590
- "I",
1591
- "J",
1592
- "K",
1593
- "L",
1594
- "M",
1595
- "P",
1596
- "Q",
1597
- "R",
1598
- "S"
1599
- ]).default(OrdType.Market).optional().describe("Order type"),
1600
- side: z.enum([
1601
- "1",
1602
- "2",
1603
- "3",
1604
- "4",
1605
- "5",
1606
- "6",
1607
- "7",
1608
- "8",
1609
- "9",
1610
- "A",
1611
- "B",
1612
- "C",
1613
- "D",
1614
- "E",
1615
- "F",
1616
- "G",
1617
- "H"
1618
- ]).describe("Order side (1=Buy, 2=Sell)"),
1619
- symbol: z.string().describe("Trading symbol"),
1620
- timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
1621
- }).parse(args || {});
1622
- const response = new Promise((resolve) => {
1623
- this.pendingRequests.set(clOrdID, resolve);
1624
- });
1625
- const order = this.parser?.createMessage(
1626
- new Field(Fields.MsgType, Messages.NewOrderSingle),
1627
- new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
1628
- new Field(Fields.SenderCompID, this.parser?.sender),
1629
- new Field(Fields.TargetCompID, this.parser?.target),
1630
- new Field(Fields.SendingTime, this.parser?.getTimestamp()),
1631
- new Field(Fields.ClOrdID, clOrdID),
1632
- new Field(Fields.Side, side),
1633
- new Field(Fields.Symbol, symbol),
1634
- new Field(Fields.OrderQty, quantity),
1635
- new Field(Fields.Price, price),
1636
- new Field(Fields.OrdType, ordType),
1637
- new Field(Fields.HandlInst, handlInst),
1638
- new Field(Fields.TimeInForce, timeInForce),
1639
- new Field(Fields.TransactTime, this.parser?.getTimestamp())
1640
- );
1641
- if (!this.parser?.connected) {
1642
- this.logger?.log({
1643
- level: "error",
1644
- message: "FIXParser (MCP): -- Not connected. Ignoring message."
352
+ case "verifyOrder": {
353
+ try {
354
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = validateArgs(args, orderSchema);
355
+ this.verifiedOrders.set(clOrdID, {
356
+ clOrdID,
357
+ handlInst,
358
+ quantity,
359
+ price,
360
+ ordType,
361
+ side,
362
+ symbol,
363
+ timeInForce
1645
364
  });
365
+ return {
366
+ content: [
367
+ {
368
+ type: "text",
369
+ text: `VERIFICATION: All parameters valid. Ready to proceed with order execution.
370
+
371
+ Parameters verified:
372
+ - ClOrdID: ${clOrdID}
373
+ - HandlInst: ${handlInst}
374
+ - Quantity: ${quantity}
375
+ - Price: ${price}
376
+ - OrdType: ${ordType}
377
+ - Side: ${side}
378
+ - Symbol: ${symbol}
379
+ - TimeInForce: ${timeInForce}
380
+
381
+ To execute this order, call the executeOrder tool with these exact same parameters.`
382
+ }
383
+ ]
384
+ };
385
+ } catch (error) {
1646
386
  return {
1647
387
  isError: true,
1648
388
  content: [
1649
389
  {
1650
390
  type: "text",
1651
- text: "Error: Not connected. Ignoring message."
391
+ text: `Error: ${error instanceof Error ? error.message : "Failed to verify order parameters"}`
392
+ }
393
+ ]
394
+ };
395
+ }
396
+ }
397
+ case "executeOrder": {
398
+ try {
399
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = validateArgs(args, orderSchema);
400
+ const verifiedOrder = this.verifiedOrders.get(clOrdID);
401
+ if (!verifiedOrder) {
402
+ return {
403
+ isError: true,
404
+ content: [
405
+ {
406
+ type: "text",
407
+ text: `Error: Order ${clOrdID} has not been verified. Please call verifyOrder first.`
408
+ }
409
+ ]
410
+ };
411
+ }
412
+ if (verifiedOrder.handlInst !== handlInst || verifiedOrder.quantity !== quantity || verifiedOrder.price !== price || verifiedOrder.ordType !== ordType || verifiedOrder.side !== side || verifiedOrder.symbol !== symbol || verifiedOrder.timeInForce !== timeInForce) {
413
+ return {
414
+ isError: true,
415
+ content: [
416
+ {
417
+ type: "text",
418
+ text: "Error: Order parameters do not match the verified order. Please use the exact same parameters that were verified."
419
+ }
420
+ ]
421
+ };
422
+ }
423
+ const response = new Promise((resolve) => {
424
+ this.pendingRequests.set(clOrdID, resolve);
425
+ });
426
+ const order = this.parser?.createMessage(
427
+ new Field(Fields.MsgType, Messages.NewOrderSingle),
428
+ new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
429
+ new Field(Fields.SenderCompID, this.parser?.sender),
430
+ new Field(Fields.TargetCompID, this.parser?.target),
431
+ new Field(Fields.SendingTime, this.parser?.getTimestamp()),
432
+ new Field(Fields.ClOrdID, clOrdID),
433
+ new Field(Fields.Side, side),
434
+ new Field(Fields.Symbol, symbol),
435
+ new Field(Fields.OrderQty, quantity),
436
+ new Field(Fields.Price, price),
437
+ new Field(Fields.OrdType, ordType),
438
+ new Field(Fields.HandlInst, handlInst),
439
+ new Field(Fields.TimeInForce, timeInForce),
440
+ new Field(Fields.TransactTime, this.parser?.getTimestamp())
441
+ );
442
+ if (!this.parser?.connected) {
443
+ return {
444
+ isError: true,
445
+ content: [
446
+ {
447
+ type: "text",
448
+ text: "Error: Not connected. Ignoring message."
449
+ }
450
+ ]
451
+ };
452
+ }
453
+ this.parser?.send(order);
454
+ const fixData = await response;
455
+ this.verifiedOrders.delete(clOrdID);
456
+ return {
457
+ content: [
458
+ {
459
+ type: "text",
460
+ text: fixData.messageType === Messages.Reject ? `Reject message for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}` : `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
461
+ }
462
+ ]
463
+ };
464
+ } catch (error) {
465
+ return {
466
+ isError: true,
467
+ content: [
468
+ {
469
+ type: "text",
470
+ text: `Error: ${error instanceof Error ? error.message : "Failed to execute order"}`
1652
471
  }
1653
472
  ]
1654
473
  };
1655
474
  }
1656
- this.parser?.send(order);
1657
- this.logger?.log({
1658
- level: "info",
1659
- message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${order?.description}`
1660
- });
1661
- const fixData = await response;
1662
- return {
1663
- content: [
1664
- {
1665
- type: "text",
1666
- text: `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
1667
- }
1668
- ]
1669
- };
1670
475
  }
1671
476
  case "marketDataRequest": {
1672
- const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = z.object({
1673
- mdUpdateType: z.enum(["0", "1"]).default("0").optional().describe("Market data update type"),
1674
- symbol: z.string().describe("Trading symbol"),
1675
- mdReqID: z.string().describe("Market data request ID"),
1676
- subscriptionRequestType: z.enum(["0", "1", "2"]).default(SubscriptionRequestType.SnapshotAndUpdates).optional().describe("Subscription request type"),
1677
- mdEntryType: z.enum([
1678
- "0",
1679
- "1",
1680
- "2",
1681
- "3",
1682
- "4",
1683
- "5",
1684
- "6",
1685
- "7",
1686
- "8",
1687
- "9",
1688
- "A",
1689
- "B",
1690
- "C",
1691
- "D",
1692
- "E",
1693
- "F",
1694
- "G",
1695
- "H",
1696
- "J",
1697
- "K",
1698
- "L",
1699
- "M",
1700
- "N",
1701
- "O",
1702
- "P",
1703
- "Q",
1704
- "S",
1705
- "R",
1706
- "T",
1707
- "U",
1708
- "V",
1709
- "W",
1710
- "X",
1711
- "Y",
1712
- "Z",
1713
- "a",
1714
- "b",
1715
- "c",
1716
- "d",
1717
- "e",
1718
- "g",
1719
- "h",
1720
- "i",
1721
- "t"
1722
- ]).default(MDEntryType.Bid).optional().describe("Market data entry type")
1723
- }).parse(args || {});
1724
- const response = new Promise((resolve) => {
1725
- this.pendingRequests.set(mdReqID, resolve);
1726
- });
1727
- const marketDataRequest = this.parser?.createMessage(
1728
- new Field(Fields.MsgType, Messages.MarketDataRequest),
1729
- new Field(Fields.SenderCompID, this.parser?.sender),
1730
- new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
1731
- new Field(Fields.TargetCompID, this.parser?.target),
1732
- new Field(Fields.SendingTime, this.parser?.getTimestamp()),
1733
- new Field(Fields.MarketDepth, 0),
1734
- new Field(Fields.MDUpdateType, mdUpdateType),
1735
- new Field(Fields.NoRelatedSym, 1),
1736
- new Field(Fields.Symbol, symbol),
1737
- new Field(Fields.MDReqID, mdReqID),
1738
- new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
1739
- new Field(Fields.NoMDEntryTypes, 1),
1740
- new Field(Fields.MDEntryType, mdEntryType)
1741
- );
1742
- if (!this.parser?.connected) {
1743
- this.logger?.log({
1744
- level: "error",
1745
- message: "FIXParser (MCP): -- Not connected. Ignoring message."
477
+ try {
478
+ const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = validateArgs(
479
+ args,
480
+ marketDataRequestInputSchema
481
+ );
482
+ const response = new Promise((resolve) => {
483
+ this.pendingRequests.set(mdReqID, resolve);
1746
484
  });
485
+ const marketDataRequest = this.parser?.createMessage(
486
+ new Field(Fields.MsgType, Messages.MarketDataRequest),
487
+ new Field(Fields.SenderCompID, this.parser?.sender),
488
+ new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
489
+ new Field(Fields.TargetCompID, this.parser?.target),
490
+ new Field(Fields.SendingTime, this.parser?.getTimestamp()),
491
+ new Field(Fields.MarketDepth, 0),
492
+ new Field(Fields.MDUpdateType, mdUpdateType),
493
+ new Field(Fields.NoRelatedSym, 1),
494
+ new Field(Fields.Symbol, symbol),
495
+ new Field(Fields.MDReqID, mdReqID),
496
+ new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
497
+ new Field(Fields.NoMDEntryTypes, 1),
498
+ new Field(Fields.MDEntryType, mdEntryType)
499
+ );
500
+ if (!this.parser?.connected) {
501
+ return {
502
+ isError: true,
503
+ content: [
504
+ {
505
+ type: "text",
506
+ text: "Error: Not connected. Ignoring message."
507
+ }
508
+ ]
509
+ };
510
+ }
511
+ this.parser?.send(marketDataRequest);
512
+ const fixData = await response;
513
+ return {
514
+ content: [
515
+ {
516
+ type: "text",
517
+ text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
518
+ }
519
+ ]
520
+ };
521
+ } catch (error) {
1747
522
  return {
1748
523
  isError: true,
1749
524
  content: [
1750
525
  {
1751
526
  type: "text",
1752
- text: "Error: Not connected. Ignoring message."
527
+ text: `Error: ${error instanceof Error ? error.message : "Failed to request market data"}`
1753
528
  }
1754
529
  ]
1755
530
  };
1756
531
  }
1757
- this.parser?.send(marketDataRequest);
1758
- this.logger?.log({
1759
- level: "info",
1760
- message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${marketDataRequest?.description}`
1761
- });
1762
- const fixData = await response;
1763
- return {
1764
- content: [
1765
- {
1766
- type: "text",
1767
- text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
1768
- }
1769
- ]
1770
- };
1771
532
  }
1772
533
  default:
1773
534
  throw new Error(`Unknown tool: ${name}`);
@@ -1799,8 +560,54 @@ var MCPLocal = class {
1799
560
  ]
1800
561
  },
1801
562
  {
1802
- name: "newOrderSingle",
1803
- description: "Creates and sends a New Order Single",
563
+ name: "verifyOrder",
564
+ description: "Verifies all parameters for a New Order Single. This is the first step - verification only, no order is sent.",
565
+ arguments: [
566
+ {
567
+ name: "clOrdID",
568
+ description: "Client Order ID",
569
+ required: true
570
+ },
571
+ {
572
+ name: "handlInst",
573
+ description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
574
+ required: true
575
+ },
576
+ {
577
+ name: "quantity",
578
+ description: "Order quantity",
579
+ required: true
580
+ },
581
+ {
582
+ name: "price",
583
+ description: "Order price",
584
+ required: true
585
+ },
586
+ {
587
+ name: "ordType",
588
+ description: "Order type (1=Market, 2=Limit, 3=Stop)",
589
+ required: true
590
+ },
591
+ {
592
+ name: "side",
593
+ 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)",
594
+ required: true
595
+ },
596
+ {
597
+ name: "symbol",
598
+ description: "Trading symbol",
599
+ required: true
600
+ },
601
+ {
602
+ name: "timeInForce",
603
+ description: "Time in force (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)",
604
+ required: true
605
+ }
606
+ ]
607
+ },
608
+ {
609
+ name: "executeOrder",
610
+ description: "Executes a New Order Single after verification. This is the second step - only call after successful verification.",
1804
611
  arguments: [
1805
612
  {
1806
613
  name: "clOrdID",
@@ -1809,8 +616,8 @@ var MCPLocal = class {
1809
616
  },
1810
617
  {
1811
618
  name: "handlInst",
1812
- description: "Handling instruction",
1813
- required: false
619
+ description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
620
+ required: true
1814
621
  },
1815
622
  {
1816
623
  name: "quantity",
@@ -1824,12 +631,12 @@ var MCPLocal = class {
1824
631
  },
1825
632
  {
1826
633
  name: "ordType",
1827
- description: "Order type",
1828
- required: false
634
+ description: "Order type (1=Market, 2=Limit, 3=Stop)",
635
+ required: true
1829
636
  },
1830
637
  {
1831
638
  name: "side",
1832
- description: "Order side (1=Buy, 2=Sell)",
639
+ 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)",
1833
640
  required: true
1834
641
  },
1835
642
  {
@@ -1839,19 +646,19 @@ var MCPLocal = class {
1839
646
  },
1840
647
  {
1841
648
  name: "timeInForce",
1842
- description: "Time in force",
1843
- required: false
649
+ description: "Time in force (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)",
650
+ required: true
1844
651
  }
1845
652
  ]
1846
653
  },
1847
654
  {
1848
655
  name: "marketDataRequest",
1849
- description: "Sends a request for Market Data with the given symbol",
656
+ description: "Sends a request for Market Data with the given symbol. IMPORTANT: All parameters must be explicitly provided by the user - no assumptions will be made.",
1850
657
  arguments: [
1851
658
  {
1852
659
  name: "mdUpdateType",
1853
- description: "Market data update type",
1854
- required: false
660
+ description: "Market data update type (0=FullRefresh, 1=IncrementalRefresh)",
661
+ required: true
1855
662
  },
1856
663
  {
1857
664
  name: "symbol",
@@ -1865,13 +672,13 @@ var MCPLocal = class {
1865
672
  },
1866
673
  {
1867
674
  name: "subscriptionRequestType",
1868
- description: "Subscription request type",
1869
- required: false
675
+ description: "Subscription request type (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
676
+ required: true
1870
677
  },
1871
678
  {
1872
679
  name: "mdEntryType",
1873
- description: "Market data entry type",
1874
- required: false
680
+ description: "Market data entry type (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
681
+ required: true
1875
682
  }
1876
683
  ]
1877
684
  }
@@ -1909,7 +716,7 @@ var MCPLocal = class {
1909
716
  ]
1910
717
  };
1911
718
  }
1912
- case "newOrderSingle": {
719
+ case "verifyOrder": {
1913
720
  const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};
1914
721
  return {
1915
722
  messages: [
@@ -1918,17 +725,68 @@ var MCPLocal = class {
1918
725
  content: {
1919
726
  type: "text",
1920
727
  text: [
1921
- "Create a New Order Single FIX message with the following parameters:",
728
+ "You are an AI assistant that helps users verify FIX New Order Single parameters.",
729
+ "This is STEP 1 of 2 - VERIFICATION ONLY. No order will be sent at this stage.",
730
+ "",
731
+ "You must verify that all required fields are provided and valid:",
732
+ "- ClOrdID (Client Order ID)",
733
+ "- HandlInst (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
734
+ "- Quantity (Order quantity)",
735
+ "- Price (Order price)",
736
+ "- OrdType (1=Market, 2=Limit, 3=Stop)",
737
+ "- 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)",
738
+ "- Symbol (Trading symbol)",
739
+ "- TimeInForce (0=Day, 1=Good Till Cancel, 2=At Opening, 3=Immediate or Cancel, 4=Fill or Kill, 5=Good Till Crossing, 6=Good Till Date)",
740
+ "",
741
+ "Current parameters to verify:",
1922
742
  `- ClOrdID: ${clOrdID}`,
1923
- `- HandlInst: ${handlInst ?? "default"}`,
743
+ `- HandlInst: ${handlInst}`,
1924
744
  `- Quantity: ${quantity}`,
1925
745
  `- Price: ${price}`,
1926
- `- OrdType: ${ordType ?? "default (Market)"}`,
746
+ `- OrdType: ${ordType}`,
1927
747
  `- Side: ${side}`,
1928
748
  `- Symbol: ${symbol}`,
1929
- `- TimeInForce: ${timeInForce ?? "default (Day)"}`,
749
+ `- TimeInForce: ${timeInForce}`,
1930
750
  "",
1931
- "Format the response as a JSON object with FIX tag numbers as keys and their corresponding values."
751
+ "If all parameters are valid, respond with:",
752
+ "`VERIFICATION: All parameters valid. Ready to proceed.`",
753
+ "",
754
+ "Otherwise, list the missing or invalid ones.",
755
+ "",
756
+ "IMPORTANT: This is only verification. To actually send the order, the user must call the executeOrder tool with the same parameters."
757
+ ].join("\n")
758
+ }
759
+ }
760
+ ]
761
+ };
762
+ }
763
+ case "executeOrder": {
764
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};
765
+ return {
766
+ messages: [
767
+ {
768
+ role: "user",
769
+ content: {
770
+ type: "text",
771
+ text: [
772
+ "You are an AI assistant that helps users execute FIX New Order Single messages.",
773
+ "This is STEP 2 of 2 - EXECUTION. This will send the order to the market.",
774
+ "",
775
+ "IMPORTANT: This tool should only be called after successful verification of all parameters.",
776
+ "",
777
+ "Parameters to execute:",
778
+ `- ClOrdID: ${clOrdID}`,
779
+ `- HandlInst: ${handlInst}`,
780
+ `- Quantity: ${quantity}`,
781
+ `- Price: ${price}`,
782
+ `- OrdType: ${ordType}`,
783
+ `- Side: ${side}`,
784
+ `- Symbol: ${symbol}`,
785
+ `- TimeInForce: ${timeInForce}`,
786
+ "",
787
+ "IMPORTANT: The response will be either:",
788
+ "1. An Execution Report (MsgType=8) if the order was successfully placed",
789
+ "2. A Reject message (MsgType=3) if the order failed to execute (e.g., due to missing or invalid parameters)"
1932
790
  ].join("\n")
1933
791
  }
1934
792
  }
@@ -1944,14 +802,27 @@ var MCPLocal = class {
1944
802
  content: {
1945
803
  type: "text",
1946
804
  text: [
1947
- "Create a Market Data Request FIX message with the following parameters:",
1948
- `- MDUpdateType: ${mdUpdateType ?? "default (0 = FullRefresh)"}`,
805
+ "You are an AI assistant that helps users create FIX Market Data Request messages.",
806
+ "You must **first verify** that all required fields are provided:",
807
+ "- MDUpdateType (0=FullRefresh, 1=IncrementalRefresh)",
808
+ "- Symbol (Trading symbol)",
809
+ "- MDReqID (Market data request ID)",
810
+ "- SubscriptionRequestType (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
811
+ "- MDEntryType (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
812
+ "",
813
+ "Only when all fields are present and valid, respond with:",
814
+ "`VERIFICATION: All parameters valid. Ready to proceed.`",
815
+ "",
816
+ "Otherwise, list the missing or invalid ones.",
817
+ "",
818
+ "Do not create the FIX message until verification is complete.",
819
+ "",
820
+ "Current parameters:",
821
+ `- MDUpdateType: ${mdUpdateType}`,
1949
822
  `- Symbol: ${symbol}`,
1950
823
  `- MDReqID: ${mdReqID}`,
1951
- `- SubscriptionRequestType: ${subscriptionRequestType ?? "default (0 = Snapshot + Updates)"}`,
1952
- `- MDEntryType: ${mdEntryType ?? "default (0 = Bid)"}`,
1953
- "",
1954
- "Format the response as a JSON object with FIX tag numbers as keys and their corresponding values."
824
+ `- SubscriptionRequestType: ${subscriptionRequestType}`,
825
+ `- MDEntryType: ${mdEntryType}`
1955
826
  ].join("\n")
1956
827
  }
1957
828
  }