fixparser-plugin-mcp 9.1.7-544294dd → 9.1.7-5f64f22e

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-_]*$/
371
- };
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"
20
+ required: ["fixString"]
763
21
  };
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
  {
@@ -1287,48 +182,48 @@ var MCPLocal = class {
1287
182
  },
1288
183
  {
1289
184
  capabilities: {
1290
- tools: {
1291
- listChanged: true
1292
- },
1293
- prompts: {
1294
- listChanged: true
1295
- },
1296
- resources: {
1297
- listChanged: true
1298
- }
185
+ tools: {},
186
+ prompts: {},
187
+ resources: {}
1299
188
  }
1300
189
  }
1301
190
  );
1302
191
  transport = new StdioServerTransport();
1303
192
  onReady = void 0;
1304
193
  pendingRequests = /* @__PURE__ */ new Map();
194
+ verifiedOrders = /* @__PURE__ */ new Map();
1305
195
  constructor({ logger, onReady }) {
1306
- if (logger) this.logger = logger;
1307
196
  if (onReady) this.onReady = onReady;
1308
197
  }
1309
198
  async register(parser) {
1310
199
  this.parser = parser;
1311
200
  this.parser.addOnMessageCallback((message) => {
1312
- this.logger?.log({
1313
- level: "info",
1314
- message: `FIXParser (MCP): (${parser.protocol?.toUpperCase()}): << received ${message.description}`
1315
- });
1316
201
  const msgType = message.messageType;
1317
- if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport) {
1318
- const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : message.getField(Fields.ClOrdID);
202
+ if (msgType === Messages.MarketDataSnapshotFullRefresh || msgType === Messages.ExecutionReport || msgType === Messages.Reject) {
203
+ const idField = msgType === Messages.MarketDataSnapshotFullRefresh ? message.getField(Fields.MDReqID) : msgType === Messages.Reject ? message.getField(Fields.RefSeqNum) : message.getField(Fields.ClOrdID);
1319
204
  if (idField) {
1320
205
  const id = idField.value;
1321
206
  if (typeof id === "string" || typeof id === "number") {
1322
- const callback = this.pendingRequests.get(String(id));
1323
- if (callback) {
1324
- callback(message);
1325
- this.pendingRequests.delete(String(id));
207
+ if (msgType === Messages.Reject) {
208
+ const refMsgType = message.getField(Fields.RefMsgType);
209
+ if (refMsgType && refMsgType.value === Messages.NewOrderSingle) {
210
+ const callback = this.pendingRequests.get(String(id));
211
+ if (callback) {
212
+ callback(message);
213
+ this.pendingRequests.delete(String(id));
214
+ }
215
+ }
216
+ } else {
217
+ const callback = this.pendingRequests.get(String(id));
218
+ if (callback) {
219
+ callback(message);
220
+ this.pendingRequests.delete(String(id));
221
+ }
1326
222
  }
1327
223
  }
1328
224
  }
1329
225
  }
1330
226
  });
1331
- this.logger = parser.logger;
1332
227
  this.addWorkflows();
1333
228
  await this.server.connect(this.transport);
1334
229
  if (this.onReady) {
@@ -1337,19 +232,27 @@ var MCPLocal = class {
1337
232
  }
1338
233
  addWorkflows() {
1339
234
  if (!this.parser) {
1340
- this.logger?.log({
1341
- level: "error",
1342
- message: "FIXParser (MCP): -- FIXParser instance not initialized. Ignoring setup of workflows..."
1343
- });
1344
235
  return;
1345
236
  }
1346
237
  if (!this.server) {
1347
- this.logger?.log({
1348
- level: "error",
1349
- message: "FIXParser (MCP): -- MCP Server not initialized. Ignoring setup of workflows..."
1350
- });
1351
238
  return;
1352
239
  }
240
+ const validateArgs = (args, schema) => {
241
+ const result = {};
242
+ for (const [key, propSchema] of Object.entries(schema.properties || {})) {
243
+ const prop = propSchema;
244
+ const value = args?.[key];
245
+ if (prop.required && (value === void 0 || value === null)) {
246
+ throw new Error(`Required property '${key}' is missing`);
247
+ }
248
+ if (value !== void 0) {
249
+ result[key] = value;
250
+ } else if (prop.default !== void 0) {
251
+ result[key] = prop.default;
252
+ }
253
+ }
254
+ return result;
255
+ };
1353
256
  this.server.setRequestHandler(ListResourcesRequestSchema, async () => {
1354
257
  return {
1355
258
  resources: []
@@ -1361,143 +264,27 @@ var MCPLocal = class {
1361
264
  {
1362
265
  name: "parse",
1363
266
  description: "Parses a FIX message and describes it in plain language",
1364
- inputSchema: zodToJsonSchema(
1365
- z.object({
1366
- fixString: z.string().describe("FIX message string to parse")
1367
- }),
1368
- { name: "ParseInput" }
1369
- )
267
+ inputSchema: parseInputSchema
1370
268
  },
1371
269
  {
1372
270
  name: "parseToJSON",
1373
271
  description: "Parses a FIX message into JSON",
1374
- inputSchema: zodToJsonSchema(
1375
- z.object({
1376
- fixString: z.string().describe("FIX message string to parse")
1377
- }),
1378
- { name: "ParseToJSONInput" }
1379
- )
272
+ inputSchema: parseToJSONInputSchema
1380
273
  },
1381
274
  {
1382
- name: "newOrderSingle",
1383
- description: "Creates and sends a New Order Single",
1384
- inputSchema: zodToJsonSchema(
1385
- z.object({
1386
- clOrdID: z.string().describe("Client Order ID"),
1387
- handlInst: z.enum(["1", "2", "3"]).default(HandlInst.AutomatedExecutionNoIntervention).optional().describe("Handling instruction"),
1388
- quantity: z.number().describe("Order quantity"),
1389
- price: z.number().describe("Order price"),
1390
- ordType: z.enum([
1391
- "1",
1392
- "2",
1393
- "3",
1394
- "4",
1395
- "5",
1396
- "6",
1397
- "7",
1398
- "8",
1399
- "9",
1400
- "A",
1401
- "B",
1402
- "C",
1403
- "D",
1404
- "E",
1405
- "F",
1406
- "G",
1407
- "H",
1408
- "I",
1409
- "J",
1410
- "K",
1411
- "L",
1412
- "M",
1413
- "P",
1414
- "Q",
1415
- "R",
1416
- "S"
1417
- ]).default("1").optional().describe("Order type"),
1418
- side: z.enum([
1419
- "1",
1420
- "2",
1421
- "3",
1422
- "4",
1423
- "5",
1424
- "6",
1425
- "7",
1426
- "8",
1427
- "9",
1428
- "A",
1429
- "B",
1430
- "C",
1431
- "D",
1432
- "E",
1433
- "F",
1434
- "G",
1435
- "H"
1436
- ]).describe("Order side (1=Buy, 2=Sell)"),
1437
- symbol: z.string().describe("Trading symbol"),
1438
- timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
1439
- }),
1440
- { name: "NewOrderSingleInput" }
1441
- )
275
+ name: "verifyOrder",
276
+ description: "Verifies all parameters for a New Order Single. This is the first step - verification only, no order is sent.",
277
+ inputSchema: orderSchema
278
+ },
279
+ {
280
+ name: "executeOrder",
281
+ description: "Executes a New Order Single after verification. This is the second step - only call after successful verification.",
282
+ inputSchema: orderSchema
1442
283
  },
1443
284
  {
1444
285
  name: "marketDataRequest",
1445
- description: "Sends a request for Market Data with the given symbol",
1446
- inputSchema: zodToJsonSchema(
1447
- z.object({
1448
- mdUpdateType: z.enum(["0", "1"]).default("0").optional().describe("Market data update type"),
1449
- symbol: z.string().describe("Trading symbol"),
1450
- mdReqID: z.string().describe("Market data request ID"),
1451
- subscriptionRequestType: z.enum(["0", "1", "2"]).default(SubscriptionRequestType.SnapshotAndUpdates).optional().describe("Subscription request type"),
1452
- mdEntryType: z.enum([
1453
- "0",
1454
- "1",
1455
- "2",
1456
- "3",
1457
- "4",
1458
- "5",
1459
- "6",
1460
- "7",
1461
- "8",
1462
- "9",
1463
- "A",
1464
- "B",
1465
- "C",
1466
- "D",
1467
- "E",
1468
- "F",
1469
- "G",
1470
- "H",
1471
- "J",
1472
- "K",
1473
- "L",
1474
- "M",
1475
- "N",
1476
- "O",
1477
- "P",
1478
- "Q",
1479
- "S",
1480
- "R",
1481
- "T",
1482
- "U",
1483
- "V",
1484
- "W",
1485
- "X",
1486
- "Y",
1487
- "Z",
1488
- "a",
1489
- "b",
1490
- "c",
1491
- "d",
1492
- "e",
1493
- "g",
1494
- "h",
1495
- "i",
1496
- "t"
1497
- ]).default(MDEntryType.Bid).optional().describe("Market data entry type")
1498
- }),
1499
- { name: "MarketDataRequestInput" }
1500
- )
286
+ 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.",
287
+ inputSchema: marketDataRequestInputSchema
1501
288
  }
1502
289
  ]
1503
290
  };
@@ -1506,10 +293,8 @@ var MCPLocal = class {
1506
293
  const { name, arguments: args } = request.params;
1507
294
  switch (name) {
1508
295
  case "parse": {
1509
- const { fixString } = z.object({
1510
- fixString: z.string().describe("FIX message string to parse")
1511
- }).parse(args || {});
1512
296
  try {
297
+ const { fixString } = validateArgs(args, parseInputSchema);
1513
298
  const parsedMessage = this.parser?.parse(fixString);
1514
299
  if (!parsedMessage || parsedMessage.length === 0) {
1515
300
  return {
@@ -1521,7 +306,8 @@ var MCPLocal = class {
1521
306
  content: [
1522
307
  {
1523
308
  type: "text",
1524
- text: `Parsed FIX message: ${fixString} (placeholder implementation)`
309
+ text: `${parsedMessage[0].description}
310
+ ${parsedMessage[0].messageTypeDescription}`
1525
311
  }
1526
312
  ]
1527
313
  };
@@ -1531,17 +317,15 @@ var MCPLocal = class {
1531
317
  content: [
1532
318
  {
1533
319
  type: "text",
1534
- text: "Error: Failed to parse FIX string"
320
+ text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
1535
321
  }
1536
322
  ]
1537
323
  };
1538
324
  }
1539
325
  }
1540
326
  case "parseToJSON": {
1541
- const { fixString } = z.object({
1542
- fixString: z.string().describe("FIX message string to parse")
1543
- }).parse(args || {});
1544
327
  try {
328
+ const { fixString } = validateArgs(args, parseToJSONInputSchema);
1545
329
  const parsedMessage = this.parser?.parse(fixString);
1546
330
  if (!parsedMessage || parsedMessage.length === 0) {
1547
331
  return {
@@ -1553,7 +337,7 @@ var MCPLocal = class {
1553
337
  content: [
1554
338
  {
1555
339
  type: "text",
1556
- text: JSON.stringify({ fixString, parsed: "placeholder" })
340
+ text: `${parsedMessage[0].toFIXJSON()}`
1557
341
  }
1558
342
  ]
1559
343
  };
@@ -1563,217 +347,192 @@ var MCPLocal = class {
1563
347
  content: [
1564
348
  {
1565
349
  type: "text",
1566
- text: "Error: Failed to parse FIX string"
350
+ text: `Error: ${error instanceof Error ? error.message : "Failed to parse FIX string"}`
1567
351
  }
1568
352
  ]
1569
353
  };
1570
354
  }
1571
355
  }
1572
- case "newOrderSingle": {
1573
- const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = z.object({
1574
- clOrdID: z.string().describe("Client Order ID"),
1575
- handlInst: z.enum(["1", "2", "3"]).default(HandlInst.AutomatedExecutionNoIntervention).optional().describe("Handling instruction"),
1576
- quantity: z.number().describe("Order quantity"),
1577
- price: z.number().describe("Order price"),
1578
- ordType: z.enum([
1579
- "1",
1580
- "2",
1581
- "3",
1582
- "4",
1583
- "5",
1584
- "6",
1585
- "7",
1586
- "8",
1587
- "9",
1588
- "A",
1589
- "B",
1590
- "C",
1591
- "D",
1592
- "E",
1593
- "F",
1594
- "G",
1595
- "H",
1596
- "I",
1597
- "J",
1598
- "K",
1599
- "L",
1600
- "M",
1601
- "P",
1602
- "Q",
1603
- "R",
1604
- "S"
1605
- ]).default(OrdType.Market).optional().describe("Order type"),
1606
- side: z.enum([
1607
- "1",
1608
- "2",
1609
- "3",
1610
- "4",
1611
- "5",
1612
- "6",
1613
- "7",
1614
- "8",
1615
- "9",
1616
- "A",
1617
- "B",
1618
- "C",
1619
- "D",
1620
- "E",
1621
- "F",
1622
- "G",
1623
- "H"
1624
- ]).describe("Order side (1=Buy, 2=Sell)"),
1625
- symbol: z.string().describe("Trading symbol"),
1626
- timeInForce: z.enum(["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C"]).default(TimeInForce.Day).optional().describe("Time in force")
1627
- }).parse(args || {});
1628
- const response = new Promise((resolve) => {
1629
- this.pendingRequests.set(clOrdID, resolve);
1630
- });
1631
- const order = this.parser?.createMessage(
1632
- new Field(Fields.MsgType, Messages.NewOrderSingle),
1633
- new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
1634
- new Field(Fields.SenderCompID, this.parser?.sender),
1635
- new Field(Fields.TargetCompID, this.parser?.target),
1636
- new Field(Fields.SendingTime, this.parser?.getTimestamp()),
1637
- new Field(Fields.ClOrdID, clOrdID),
1638
- new Field(Fields.Side, side),
1639
- new Field(Fields.Symbol, symbol),
1640
- new Field(Fields.OrderQty, quantity),
1641
- new Field(Fields.Price, price),
1642
- new Field(Fields.OrdType, ordType),
1643
- new Field(Fields.HandlInst, handlInst),
1644
- new Field(Fields.TimeInForce, timeInForce),
1645
- new Field(Fields.TransactTime, this.parser?.getTimestamp())
1646
- );
1647
- if (!this.parser?.connected) {
1648
- this.logger?.log({
1649
- level: "error",
1650
- message: "FIXParser (MCP): -- Not connected. Ignoring message."
356
+ case "verifyOrder": {
357
+ try {
358
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = validateArgs(args, orderSchema);
359
+ this.verifiedOrders.set(clOrdID, {
360
+ clOrdID,
361
+ handlInst,
362
+ quantity,
363
+ price,
364
+ ordType,
365
+ side,
366
+ symbol,
367
+ timeInForce
1651
368
  });
369
+ return {
370
+ content: [
371
+ {
372
+ type: "text",
373
+ text: `VERIFICATION: All parameters valid. Ready to proceed with order execution.
374
+
375
+ Parameters verified:
376
+ - ClOrdID: ${clOrdID}
377
+ - HandlInst: ${handlInst}
378
+ - Quantity: ${quantity}
379
+ - Price: ${price}
380
+ - OrdType: ${ordType}
381
+ - Side: ${side}
382
+ - Symbol: ${symbol}
383
+ - TimeInForce: ${timeInForce}
384
+
385
+ To execute this order, call the executeOrder tool with these exact same parameters.`
386
+ }
387
+ ]
388
+ };
389
+ } catch (error) {
1652
390
  return {
1653
391
  isError: true,
1654
392
  content: [
1655
393
  {
1656
394
  type: "text",
1657
- text: "Error: Not connected. Ignoring message."
395
+ text: `Error: ${error instanceof Error ? error.message : "Failed to verify order parameters"}`
396
+ }
397
+ ]
398
+ };
399
+ }
400
+ }
401
+ case "executeOrder": {
402
+ try {
403
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = validateArgs(args, orderSchema);
404
+ const verifiedOrder = this.verifiedOrders.get(clOrdID);
405
+ if (!verifiedOrder) {
406
+ return {
407
+ isError: true,
408
+ content: [
409
+ {
410
+ type: "text",
411
+ text: `Error: Order ${clOrdID} has not been verified. Please call verifyOrder first.`
412
+ }
413
+ ]
414
+ };
415
+ }
416
+ if (verifiedOrder.handlInst !== handlInst || verifiedOrder.quantity !== quantity || verifiedOrder.price !== price || verifiedOrder.ordType !== ordType || verifiedOrder.side !== side || verifiedOrder.symbol !== symbol || verifiedOrder.timeInForce !== timeInForce) {
417
+ return {
418
+ isError: true,
419
+ content: [
420
+ {
421
+ type: "text",
422
+ text: "Error: Order parameters do not match the verified order. Please use the exact same parameters that were verified."
423
+ }
424
+ ]
425
+ };
426
+ }
427
+ const response = new Promise((resolve) => {
428
+ this.pendingRequests.set(clOrdID, resolve);
429
+ });
430
+ const order = this.parser?.createMessage(
431
+ new Field(Fields.MsgType, Messages.NewOrderSingle),
432
+ new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
433
+ new Field(Fields.SenderCompID, this.parser?.sender),
434
+ new Field(Fields.TargetCompID, this.parser?.target),
435
+ new Field(Fields.SendingTime, this.parser?.getTimestamp()),
436
+ new Field(Fields.ClOrdID, clOrdID),
437
+ new Field(Fields.Side, side),
438
+ new Field(Fields.Symbol, symbol),
439
+ new Field(Fields.OrderQty, quantity),
440
+ new Field(Fields.Price, price),
441
+ new Field(Fields.OrdType, ordType),
442
+ new Field(Fields.HandlInst, handlInst),
443
+ new Field(Fields.TimeInForce, timeInForce),
444
+ new Field(Fields.TransactTime, this.parser?.getTimestamp())
445
+ );
446
+ if (!this.parser?.connected) {
447
+ return {
448
+ isError: true,
449
+ content: [
450
+ {
451
+ type: "text",
452
+ text: "Error: Not connected. Ignoring message."
453
+ }
454
+ ]
455
+ };
456
+ }
457
+ this.parser?.send(order);
458
+ const fixData = await response;
459
+ this.verifiedOrders.delete(clOrdID);
460
+ return {
461
+ content: [
462
+ {
463
+ type: "text",
464
+ text: fixData.messageType === Messages.Reject ? `Reject message for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}` : `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
465
+ }
466
+ ]
467
+ };
468
+ } catch (error) {
469
+ return {
470
+ isError: true,
471
+ content: [
472
+ {
473
+ type: "text",
474
+ text: `Error: ${error instanceof Error ? error.message : "Failed to execute order"}`
1658
475
  }
1659
476
  ]
1660
477
  };
1661
478
  }
1662
- this.parser?.send(order);
1663
- this.logger?.log({
1664
- level: "info",
1665
- message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${order?.description}`
1666
- });
1667
- const fixData = await response;
1668
- return {
1669
- content: [
1670
- {
1671
- type: "text",
1672
- text: `Execution Report for order ${clOrdID}: ${JSON.stringify(fixData.toFIXJSON())}`
1673
- }
1674
- ]
1675
- };
1676
479
  }
1677
480
  case "marketDataRequest": {
1678
- const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = z.object({
1679
- mdUpdateType: z.enum(["0", "1"]).default("0").optional().describe("Market data update type"),
1680
- symbol: z.string().describe("Trading symbol"),
1681
- mdReqID: z.string().describe("Market data request ID"),
1682
- subscriptionRequestType: z.enum(["0", "1", "2"]).default(SubscriptionRequestType.SnapshotAndUpdates).optional().describe("Subscription request type"),
1683
- mdEntryType: z.enum([
1684
- "0",
1685
- "1",
1686
- "2",
1687
- "3",
1688
- "4",
1689
- "5",
1690
- "6",
1691
- "7",
1692
- "8",
1693
- "9",
1694
- "A",
1695
- "B",
1696
- "C",
1697
- "D",
1698
- "E",
1699
- "F",
1700
- "G",
1701
- "H",
1702
- "J",
1703
- "K",
1704
- "L",
1705
- "M",
1706
- "N",
1707
- "O",
1708
- "P",
1709
- "Q",
1710
- "S",
1711
- "R",
1712
- "T",
1713
- "U",
1714
- "V",
1715
- "W",
1716
- "X",
1717
- "Y",
1718
- "Z",
1719
- "a",
1720
- "b",
1721
- "c",
1722
- "d",
1723
- "e",
1724
- "g",
1725
- "h",
1726
- "i",
1727
- "t"
1728
- ]).default(MDEntryType.Bid).optional().describe("Market data entry type")
1729
- }).parse(args || {});
1730
- const response = new Promise((resolve) => {
1731
- this.pendingRequests.set(mdReqID, resolve);
1732
- });
1733
- const marketDataRequest = this.parser?.createMessage(
1734
- new Field(Fields.MsgType, Messages.MarketDataRequest),
1735
- new Field(Fields.SenderCompID, this.parser?.sender),
1736
- new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
1737
- new Field(Fields.TargetCompID, this.parser?.target),
1738
- new Field(Fields.SendingTime, this.parser?.getTimestamp()),
1739
- new Field(Fields.MarketDepth, 0),
1740
- new Field(Fields.MDUpdateType, mdUpdateType),
1741
- new Field(Fields.NoRelatedSym, 1),
1742
- new Field(Fields.Symbol, symbol),
1743
- new Field(Fields.MDReqID, mdReqID),
1744
- new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
1745
- new Field(Fields.NoMDEntryTypes, 1),
1746
- new Field(Fields.MDEntryType, mdEntryType)
1747
- );
1748
- if (!this.parser?.connected) {
1749
- this.logger?.log({
1750
- level: "error",
1751
- message: "FIXParser (MCP): -- Not connected. Ignoring message."
481
+ try {
482
+ const { mdUpdateType, symbol, mdReqID, subscriptionRequestType, mdEntryType } = validateArgs(
483
+ args,
484
+ marketDataRequestInputSchema
485
+ );
486
+ const response = new Promise((resolve) => {
487
+ this.pendingRequests.set(mdReqID, resolve);
1752
488
  });
489
+ const marketDataRequest = this.parser?.createMessage(
490
+ new Field(Fields.MsgType, Messages.MarketDataRequest),
491
+ new Field(Fields.SenderCompID, this.parser?.sender),
492
+ new Field(Fields.MsgSeqNum, this.parser?.getNextTargetMsgSeqNum()),
493
+ new Field(Fields.TargetCompID, this.parser?.target),
494
+ new Field(Fields.SendingTime, this.parser?.getTimestamp()),
495
+ new Field(Fields.MarketDepth, 0),
496
+ new Field(Fields.MDUpdateType, mdUpdateType),
497
+ new Field(Fields.NoRelatedSym, 1),
498
+ new Field(Fields.Symbol, symbol),
499
+ new Field(Fields.MDReqID, mdReqID),
500
+ new Field(Fields.SubscriptionRequestType, subscriptionRequestType),
501
+ new Field(Fields.NoMDEntryTypes, 1),
502
+ new Field(Fields.MDEntryType, mdEntryType)
503
+ );
504
+ if (!this.parser?.connected) {
505
+ return {
506
+ isError: true,
507
+ content: [
508
+ {
509
+ type: "text",
510
+ text: "Error: Not connected. Ignoring message."
511
+ }
512
+ ]
513
+ };
514
+ }
515
+ this.parser?.send(marketDataRequest);
516
+ const fixData = await response;
517
+ return {
518
+ content: [
519
+ {
520
+ type: "text",
521
+ text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
522
+ }
523
+ ]
524
+ };
525
+ } catch (error) {
1753
526
  return {
1754
527
  isError: true,
1755
528
  content: [
1756
529
  {
1757
530
  type: "text",
1758
- text: "Error: Not connected. Ignoring message."
531
+ text: `Error: ${error instanceof Error ? error.message : "Failed to request market data"}`
1759
532
  }
1760
533
  ]
1761
534
  };
1762
535
  }
1763
- this.parser?.send(marketDataRequest);
1764
- this.logger?.log({
1765
- level: "info",
1766
- message: `FIXParser (MCP): (${this.parser?.protocol?.toUpperCase()}): >> sent ${marketDataRequest?.description}`
1767
- });
1768
- const fixData = await response;
1769
- return {
1770
- content: [
1771
- {
1772
- type: "text",
1773
- text: `Market data for ${symbol}: ${JSON.stringify(fixData.toFIXJSON())}`
1774
- }
1775
- ]
1776
- };
1777
536
  }
1778
537
  default:
1779
538
  throw new Error(`Unknown tool: ${name}`);
@@ -1805,8 +564,8 @@ var MCPLocal = class {
1805
564
  ]
1806
565
  },
1807
566
  {
1808
- name: "newOrderSingle",
1809
- description: "Creates and sends a New Order Single",
567
+ name: "verifyOrder",
568
+ description: "Verifies all parameters for a New Order Single. This is the first step - verification only, no order is sent.",
1810
569
  arguments: [
1811
570
  {
1812
571
  name: "clOrdID",
@@ -1815,8 +574,8 @@ var MCPLocal = class {
1815
574
  },
1816
575
  {
1817
576
  name: "handlInst",
1818
- description: "Handling instruction",
1819
- required: false
577
+ description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
578
+ required: true
1820
579
  },
1821
580
  {
1822
581
  name: "quantity",
@@ -1830,12 +589,12 @@ var MCPLocal = class {
1830
589
  },
1831
590
  {
1832
591
  name: "ordType",
1833
- description: "Order type",
1834
- required: false
592
+ description: "Order type (1=Market, 2=Limit, 3=Stop)",
593
+ required: true
1835
594
  },
1836
595
  {
1837
596
  name: "side",
1838
- description: "Order side (1=Buy, 2=Sell)",
597
+ 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)",
1839
598
  required: true
1840
599
  },
1841
600
  {
@@ -1845,19 +604,65 @@ var MCPLocal = class {
1845
604
  },
1846
605
  {
1847
606
  name: "timeInForce",
1848
- description: "Time in force",
1849
- required: false
607
+ 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)",
608
+ required: true
609
+ }
610
+ ]
611
+ },
612
+ {
613
+ name: "executeOrder",
614
+ description: "Executes a New Order Single after verification. This is the second step - only call after successful verification.",
615
+ arguments: [
616
+ {
617
+ name: "clOrdID",
618
+ description: "Client Order ID",
619
+ required: true
620
+ },
621
+ {
622
+ name: "handlInst",
623
+ description: "Handling instruction (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
624
+ required: true
625
+ },
626
+ {
627
+ name: "quantity",
628
+ description: "Order quantity",
629
+ required: true
630
+ },
631
+ {
632
+ name: "price",
633
+ description: "Order price",
634
+ required: true
635
+ },
636
+ {
637
+ name: "ordType",
638
+ description: "Order type (1=Market, 2=Limit, 3=Stop)",
639
+ required: true
640
+ },
641
+ {
642
+ name: "side",
643
+ 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)",
644
+ required: true
645
+ },
646
+ {
647
+ name: "symbol",
648
+ description: "Trading symbol",
649
+ required: true
650
+ },
651
+ {
652
+ name: "timeInForce",
653
+ 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)",
654
+ required: true
1850
655
  }
1851
656
  ]
1852
657
  },
1853
658
  {
1854
659
  name: "marketDataRequest",
1855
- description: "Sends a request for Market Data with the given symbol",
660
+ 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.",
1856
661
  arguments: [
1857
662
  {
1858
663
  name: "mdUpdateType",
1859
- description: "Market data update type",
1860
- required: false
664
+ description: "Market data update type (0=FullRefresh, 1=IncrementalRefresh)",
665
+ required: true
1861
666
  },
1862
667
  {
1863
668
  name: "symbol",
@@ -1871,13 +676,13 @@ var MCPLocal = class {
1871
676
  },
1872
677
  {
1873
678
  name: "subscriptionRequestType",
1874
- description: "Subscription request type",
1875
- required: false
679
+ description: "Subscription request type (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
680
+ required: true
1876
681
  },
1877
682
  {
1878
683
  name: "mdEntryType",
1879
- description: "Market data entry type",
1880
- required: false
684
+ description: "Market data entry type (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
685
+ required: true
1881
686
  }
1882
687
  ]
1883
688
  }
@@ -1915,7 +720,7 @@ var MCPLocal = class {
1915
720
  ]
1916
721
  };
1917
722
  }
1918
- case "newOrderSingle": {
723
+ case "verifyOrder": {
1919
724
  const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};
1920
725
  return {
1921
726
  messages: [
@@ -1924,17 +729,68 @@ var MCPLocal = class {
1924
729
  content: {
1925
730
  type: "text",
1926
731
  text: [
1927
- "Create a New Order Single FIX message with the following parameters:",
732
+ "You are an AI assistant that helps users verify FIX New Order Single parameters.",
733
+ "This is STEP 1 of 2 - VERIFICATION ONLY. No order will be sent at this stage.",
734
+ "",
735
+ "You must verify that all required fields are provided and valid:",
736
+ "- ClOrdID (Client Order ID)",
737
+ "- HandlInst (1=Manual, 2=Automated, 3=AutomatedNoIntervention)",
738
+ "- Quantity (Order quantity)",
739
+ "- Price (Order price)",
740
+ "- OrdType (1=Market, 2=Limit, 3=Stop)",
741
+ "- 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)",
742
+ "- Symbol (Trading symbol)",
743
+ "- 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)",
744
+ "",
745
+ "Current parameters to verify:",
1928
746
  `- ClOrdID: ${clOrdID}`,
1929
- `- HandlInst: ${handlInst ?? "default"}`,
747
+ `- HandlInst: ${handlInst}`,
1930
748
  `- Quantity: ${quantity}`,
1931
749
  `- Price: ${price}`,
1932
- `- OrdType: ${ordType ?? "default (Market)"}`,
750
+ `- OrdType: ${ordType}`,
1933
751
  `- Side: ${side}`,
1934
752
  `- Symbol: ${symbol}`,
1935
- `- TimeInForce: ${timeInForce ?? "default (Day)"}`,
753
+ `- TimeInForce: ${timeInForce}`,
1936
754
  "",
1937
- "Format the response as a JSON object with FIX tag numbers as keys and their corresponding values."
755
+ "If all parameters are valid, respond with:",
756
+ "`VERIFICATION: All parameters valid. Ready to proceed.`",
757
+ "",
758
+ "Otherwise, list the missing or invalid ones.",
759
+ "",
760
+ "IMPORTANT: This is only verification. To actually send the order, the user must call the executeOrder tool with the same parameters."
761
+ ].join("\n")
762
+ }
763
+ }
764
+ ]
765
+ };
766
+ }
767
+ case "executeOrder": {
768
+ const { clOrdID, handlInst, quantity, price, ordType, side, symbol, timeInForce } = args || {};
769
+ return {
770
+ messages: [
771
+ {
772
+ role: "user",
773
+ content: {
774
+ type: "text",
775
+ text: [
776
+ "You are an AI assistant that helps users execute FIX New Order Single messages.",
777
+ "This is STEP 2 of 2 - EXECUTION. This will send the order to the market.",
778
+ "",
779
+ "IMPORTANT: This tool should only be called after successful verification of all parameters.",
780
+ "",
781
+ "Parameters to execute:",
782
+ `- ClOrdID: ${clOrdID}`,
783
+ `- HandlInst: ${handlInst}`,
784
+ `- Quantity: ${quantity}`,
785
+ `- Price: ${price}`,
786
+ `- OrdType: ${ordType}`,
787
+ `- Side: ${side}`,
788
+ `- Symbol: ${symbol}`,
789
+ `- TimeInForce: ${timeInForce}`,
790
+ "",
791
+ "IMPORTANT: The response will be either:",
792
+ "1. An Execution Report (MsgType=8) if the order was successfully placed",
793
+ "2. A Reject message (MsgType=3) if the order failed to execute (e.g., due to missing or invalid parameters)"
1938
794
  ].join("\n")
1939
795
  }
1940
796
  }
@@ -1950,14 +806,27 @@ var MCPLocal = class {
1950
806
  content: {
1951
807
  type: "text",
1952
808
  text: [
1953
- "Create a Market Data Request FIX message with the following parameters:",
1954
- `- MDUpdateType: ${mdUpdateType ?? "default (0 = FullRefresh)"}`,
809
+ "You are an AI assistant that helps users create FIX Market Data Request messages.",
810
+ "You must **first verify** that all required fields are provided:",
811
+ "- MDUpdateType (0=FullRefresh, 1=IncrementalRefresh)",
812
+ "- Symbol (Trading symbol)",
813
+ "- MDReqID (Market data request ID)",
814
+ "- SubscriptionRequestType (0=Snapshot + Updates, 1=Snapshot, 2=Unsubscribe)",
815
+ "- MDEntryType (0=Bid, 1=Offer, 2=Trade, 3=Index Value, 4=Opening Price)",
816
+ "",
817
+ "Only when all fields are present and valid, respond with:",
818
+ "`VERIFICATION: All parameters valid. Ready to proceed.`",
819
+ "",
820
+ "Otherwise, list the missing or invalid ones.",
821
+ "",
822
+ "Do not create the FIX message until verification is complete.",
823
+ "",
824
+ "Current parameters:",
825
+ `- MDUpdateType: ${mdUpdateType}`,
1955
826
  `- Symbol: ${symbol}`,
1956
827
  `- MDReqID: ${mdReqID}`,
1957
- `- SubscriptionRequestType: ${subscriptionRequestType ?? "default (0 = Snapshot + Updates)"}`,
1958
- `- MDEntryType: ${mdEntryType ?? "default (0 = Bid)"}`,
1959
- "",
1960
- "Format the response as a JSON object with FIX tag numbers as keys and their corresponding values."
828
+ `- SubscriptionRequestType: ${subscriptionRequestType}`,
829
+ `- MDEntryType: ${mdEntryType}`
1961
830
  ].join("\n")
1962
831
  }
1963
832
  }