@run-iq/mcp-server 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +194 -145
- package/dist/index.js.map +1 -1
- package/package.json +57 -57
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
+
import fs from "fs/promises";
|
|
5
|
+
import path2 from "path";
|
|
4
6
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
7
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
6
8
|
|
|
@@ -41,20 +43,20 @@ var DescriptorRegistry = class {
|
|
|
41
43
|
};
|
|
42
44
|
|
|
43
45
|
// src/engine.ts
|
|
44
|
-
function createEngine(
|
|
45
|
-
const
|
|
46
|
+
function createEngine(bundles) {
|
|
47
|
+
const descriptorRegistry = new DescriptorRegistry();
|
|
46
48
|
const allPlugins = [];
|
|
47
49
|
const allDsls = [];
|
|
48
|
-
if (
|
|
49
|
-
for (const bundle of
|
|
50
|
+
if (bundles && bundles.length > 0) {
|
|
51
|
+
for (const bundle of bundles) {
|
|
50
52
|
allPlugins.push(bundle.plugin);
|
|
51
|
-
|
|
53
|
+
descriptorRegistry.register(bundle.descriptor);
|
|
52
54
|
if (bundle.dsls) {
|
|
53
55
|
allDsls.push(...bundle.dsls);
|
|
54
56
|
}
|
|
55
57
|
}
|
|
56
58
|
}
|
|
57
|
-
const
|
|
59
|
+
const engine = new PPEEngine({
|
|
58
60
|
plugins: allPlugins,
|
|
59
61
|
dsls: allDsls,
|
|
60
62
|
dryRun: true,
|
|
@@ -62,26 +64,27 @@ function createEngine(bundles2) {
|
|
|
62
64
|
onConflict: "first",
|
|
63
65
|
onChecksumMismatch: "skip"
|
|
64
66
|
});
|
|
65
|
-
const
|
|
67
|
+
const models = /* @__PURE__ */ new Map();
|
|
66
68
|
for (const plugin of allPlugins) {
|
|
67
69
|
const pluginWithModels = plugin;
|
|
68
70
|
if (Array.isArray(pluginWithModels.models)) {
|
|
69
71
|
for (const model of pluginWithModels.models) {
|
|
70
|
-
|
|
72
|
+
models.set(model.name, model);
|
|
71
73
|
}
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
|
-
return { engine
|
|
76
|
+
return { engine, models, descriptorRegistry, plugins: allPlugins, dsls: allDsls };
|
|
75
77
|
}
|
|
76
78
|
|
|
77
79
|
// src/loader/plugin-loader.ts
|
|
78
80
|
import { readdir } from "fs/promises";
|
|
79
81
|
import { resolve } from "path";
|
|
82
|
+
import path from "path";
|
|
80
83
|
import { pathToFileURL } from "url";
|
|
81
84
|
import { createRequire } from "module";
|
|
82
85
|
var require2 = createRequire(import.meta.url);
|
|
83
86
|
async function loadPluginsFromDir(dir) {
|
|
84
|
-
const
|
|
87
|
+
const bundles = [];
|
|
85
88
|
const absoluteDir = resolve(dir);
|
|
86
89
|
const entries = await readdir(absoluteDir, { withFileTypes: true });
|
|
87
90
|
for (const entry of entries) {
|
|
@@ -91,37 +94,42 @@ async function loadPluginsFromDir(dir) {
|
|
|
91
94
|
const mod = await import(filePath);
|
|
92
95
|
const bundle = mod["default"] ?? mod;
|
|
93
96
|
if (bundle["plugin"] && typeof bundle["plugin"] === "object" && bundle["descriptor"] && typeof bundle["descriptor"] === "object") {
|
|
94
|
-
|
|
97
|
+
bundles.push(bundle);
|
|
95
98
|
}
|
|
96
99
|
}
|
|
97
|
-
return
|
|
100
|
+
return bundles;
|
|
98
101
|
}
|
|
99
102
|
async function loadNpmPlugins(packageNames) {
|
|
100
|
-
const
|
|
103
|
+
const bundles = [];
|
|
101
104
|
for (const pkgName of packageNames) {
|
|
102
105
|
try {
|
|
103
|
-
|
|
106
|
+
let resolvedPath;
|
|
107
|
+
if (pkgName.startsWith(".") || pkgName.startsWith("/") || pkgName.includes(":")) {
|
|
108
|
+
resolvedPath = path.resolve(process.cwd(), pkgName);
|
|
109
|
+
} else {
|
|
110
|
+
resolvedPath = require2.resolve(pkgName, { paths: [process.cwd()] });
|
|
111
|
+
}
|
|
104
112
|
const mod = await import(pathToFileURL(resolvedPath).href);
|
|
105
113
|
const bundle = mod["default"] ?? mod["bundle"] ?? mod;
|
|
106
114
|
if (bundle && typeof bundle === "object" && bundle["plugin"] && bundle["descriptor"]) {
|
|
107
|
-
|
|
115
|
+
bundles.push(bundle);
|
|
108
116
|
} else {
|
|
109
117
|
console.error(
|
|
110
|
-
`[MCP] Invalid PluginBundle exported by
|
|
118
|
+
`[MCP] Invalid PluginBundle exported by "${pkgName}". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`
|
|
111
119
|
);
|
|
112
120
|
}
|
|
113
121
|
} catch (err) {
|
|
114
|
-
console.error(`[MCP] Failed to load
|
|
122
|
+
console.error(`[MCP] Failed to load plugin "${pkgName}":`, err instanceof Error ? err.message : err);
|
|
115
123
|
}
|
|
116
124
|
}
|
|
117
|
-
return
|
|
125
|
+
return bundles;
|
|
118
126
|
}
|
|
119
127
|
|
|
120
128
|
// src/tools/create-checksum.ts
|
|
121
129
|
import { createHash } from "crypto";
|
|
122
130
|
import { z } from "zod";
|
|
123
|
-
function registerCreateChecksumTool(
|
|
124
|
-
|
|
131
|
+
function registerCreateChecksumTool(server) {
|
|
132
|
+
server.tool(
|
|
125
133
|
"create_checksum",
|
|
126
134
|
"Compute the SHA-256 checksum of a params object. Used to generate the checksum field for Run-IQ rules.",
|
|
127
135
|
{ params: z.record(z.unknown()).describe("The params object to hash") },
|
|
@@ -161,7 +169,7 @@ function buildFieldSchema(field) {
|
|
|
161
169
|
}
|
|
162
170
|
return schema.describe(field.description);
|
|
163
171
|
}
|
|
164
|
-
function buildCreateRuleSchema(
|
|
172
|
+
function buildCreateRuleSchema(descriptors) {
|
|
165
173
|
const shape = {
|
|
166
174
|
id: z2.string().describe("Unique rule identifier"),
|
|
167
175
|
model: z2.string().describe("Calculation model name (e.g. FLAT_RATE, PROGRESSIVE_BRACKET)"),
|
|
@@ -175,16 +183,16 @@ function buildCreateRuleSchema(descriptors2) {
|
|
|
175
183
|
value: z2.unknown().describe("DSL-specific condition expression")
|
|
176
184
|
}).optional().describe("Optional condition expression")
|
|
177
185
|
};
|
|
178
|
-
for (const descriptor of
|
|
186
|
+
for (const descriptor of descriptors) {
|
|
179
187
|
for (const field of descriptor.ruleExtensions) {
|
|
180
188
|
shape[field.name] = buildFieldSchema(field);
|
|
181
189
|
}
|
|
182
190
|
}
|
|
183
191
|
return shape;
|
|
184
192
|
}
|
|
185
|
-
function buildValidateExtensionErrors(rule,
|
|
193
|
+
function buildValidateExtensionErrors(rule, descriptors) {
|
|
186
194
|
const errors = [];
|
|
187
|
-
for (const descriptor of
|
|
195
|
+
for (const descriptor of descriptors) {
|
|
188
196
|
for (const field of descriptor.ruleExtensions) {
|
|
189
197
|
const value = rule[field.name];
|
|
190
198
|
if (field.required && (value === void 0 || value === null)) {
|
|
@@ -212,10 +220,10 @@ function buildValidateExtensionErrors(rule, descriptors2) {
|
|
|
212
220
|
}
|
|
213
221
|
|
|
214
222
|
// src/tools/create-rule.ts
|
|
215
|
-
function registerCreateRuleTool(
|
|
216
|
-
const schema = buildCreateRuleSchema(
|
|
217
|
-
const extensionFields =
|
|
218
|
-
|
|
223
|
+
function registerCreateRuleTool(server, descriptors) {
|
|
224
|
+
const schema = buildCreateRuleSchema(descriptors);
|
|
225
|
+
const extensionFields = descriptors.flatMap((d) => d.ruleExtensions.map((f) => f.name));
|
|
226
|
+
server.tool(
|
|
219
227
|
"create_rule",
|
|
220
228
|
"Generate a valid Run-IQ Rule JSON object with auto-computed SHA-256 checksum. Includes plugin-specific fields based on loaded plugins.",
|
|
221
229
|
schema,
|
|
@@ -263,16 +271,17 @@ var RuleSchema = z3.object({
|
|
|
263
271
|
checksum: z3.string(),
|
|
264
272
|
condition: z3.object({ dsl: z3.string(), value: z3.unknown() }).optional()
|
|
265
273
|
});
|
|
266
|
-
function registerValidateRulesTool(
|
|
267
|
-
|
|
274
|
+
function registerValidateRulesTool(server, models, descriptors, initialRules = []) {
|
|
275
|
+
server.tool(
|
|
268
276
|
"validate_rules",
|
|
269
277
|
"Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.",
|
|
270
278
|
{
|
|
271
|
-
rules: z3.array(z3.record(z3.unknown())).describe("Array of Rule JSON objects to validate")
|
|
279
|
+
rules: z3.array(z3.record(z3.unknown())).optional().describe("Array of Rule JSON objects to validate")
|
|
272
280
|
},
|
|
273
281
|
(args) => {
|
|
274
282
|
const entries = [];
|
|
275
|
-
|
|
283
|
+
const rulesToValidate = [...initialRules, ...args.rules || []];
|
|
284
|
+
for (const raw of rulesToValidate) {
|
|
276
285
|
const parsed = RuleSchema.safeParse(raw);
|
|
277
286
|
const ruleId = typeof raw["id"] === "string" ? raw["id"] : "unknown";
|
|
278
287
|
if (!parsed.success) {
|
|
@@ -289,10 +298,10 @@ function registerValidateRulesTool(server2, models2, descriptors2) {
|
|
|
289
298
|
if (computed !== rule.checksum) {
|
|
290
299
|
errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);
|
|
291
300
|
}
|
|
292
|
-
const model =
|
|
301
|
+
const model = models.get(rule.model);
|
|
293
302
|
if (!model) {
|
|
294
303
|
errors.push(
|
|
295
|
-
`Model "${rule.model}" not found. Available: ${[...
|
|
304
|
+
`Model "${rule.model}" not found. Available: ${[...models.keys()].join(", ")}`
|
|
296
305
|
);
|
|
297
306
|
} else {
|
|
298
307
|
const validation = model.validateParams(rule.params);
|
|
@@ -300,7 +309,7 @@ function registerValidateRulesTool(server2, models2, descriptors2) {
|
|
|
300
309
|
errors.push(...validation.errors);
|
|
301
310
|
}
|
|
302
311
|
}
|
|
303
|
-
const extensionErrors = buildValidateExtensionErrors(raw,
|
|
312
|
+
const extensionErrors = buildValidateExtensionErrors(raw, descriptors);
|
|
304
313
|
errors.push(...extensionErrors);
|
|
305
314
|
entries.push({
|
|
306
315
|
ruleId: rule.id,
|
|
@@ -316,14 +325,14 @@ function registerValidateRulesTool(server2, models2, descriptors2) {
|
|
|
316
325
|
}
|
|
317
326
|
|
|
318
327
|
// src/tools/list-models.ts
|
|
319
|
-
function registerListModelsTool(
|
|
320
|
-
|
|
328
|
+
function registerListModelsTool(server, models) {
|
|
329
|
+
server.tool(
|
|
321
330
|
"list_models",
|
|
322
331
|
"List all available calculation models with their parameter schemas. Shows model name, version, and expected parameters.",
|
|
323
332
|
{},
|
|
324
333
|
() => {
|
|
325
334
|
const result = [];
|
|
326
|
-
for (const [, model] of
|
|
335
|
+
for (const [, model] of models) {
|
|
327
336
|
const validation = model.validateParams({});
|
|
328
337
|
const paramsSchema = {};
|
|
329
338
|
if (validation.errors) {
|
|
@@ -350,8 +359,8 @@ function registerListModelsTool(server2, models2) {
|
|
|
350
359
|
// src/tools/evaluate.ts
|
|
351
360
|
import { z as z4 } from "zod";
|
|
352
361
|
import { hydrateRules } from "@run-iq/core";
|
|
353
|
-
function registerEvaluateTool(
|
|
354
|
-
|
|
362
|
+
function registerEvaluateTool(server, engine, initialRules = []) {
|
|
363
|
+
server.tool(
|
|
355
364
|
"evaluate",
|
|
356
365
|
"Evaluate Run-IQ rules against input data in dry-run mode. Returns the computed value, breakdown per rule, applied/skipped rules, and execution trace.",
|
|
357
366
|
{
|
|
@@ -370,7 +379,7 @@ function registerEvaluateTool(server2, engine2) {
|
|
|
370
379
|
},
|
|
371
380
|
async (args) => {
|
|
372
381
|
try {
|
|
373
|
-
const rules = hydrateRules(args.rules);
|
|
382
|
+
const rules = hydrateRules([...initialRules, ...args.rules || []]);
|
|
374
383
|
const input = {
|
|
375
384
|
data: args.input.data,
|
|
376
385
|
requestId: args.input.requestId,
|
|
@@ -379,7 +388,7 @@ function registerEvaluateTool(server2, engine2) {
|
|
|
379
388
|
effectiveDate: args.input.meta.effectiveDate ? new Date(args.input.meta.effectiveDate) : void 0
|
|
380
389
|
}
|
|
381
390
|
};
|
|
382
|
-
const result = await
|
|
391
|
+
const result = await engine.evaluate(rules, input);
|
|
383
392
|
const serializable = {
|
|
384
393
|
value: result.value,
|
|
385
394
|
breakdown: result.breakdown,
|
|
@@ -419,22 +428,32 @@ function registerEvaluateTool(server2, engine2) {
|
|
|
419
428
|
// src/tools/inspect-rule.ts
|
|
420
429
|
import { createHash as createHash4 } from "crypto";
|
|
421
430
|
import { z as z5 } from "zod";
|
|
422
|
-
function registerInspectRuleTool(
|
|
423
|
-
|
|
431
|
+
function registerInspectRuleTool(server, models, descriptors, initialRules = []) {
|
|
432
|
+
server.tool(
|
|
424
433
|
"inspect_rule",
|
|
425
434
|
"Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.",
|
|
426
435
|
{
|
|
427
|
-
rule: z5.record(z5.unknown()).describe("A single Rule JSON object to inspect")
|
|
436
|
+
rule: z5.record(z5.unknown()).optional().describe("A single Rule JSON object to inspect"),
|
|
437
|
+
ruleId: z5.string().optional().describe("ID of a pre-loaded rule to inspect")
|
|
428
438
|
},
|
|
429
439
|
(args) => {
|
|
430
|
-
|
|
440
|
+
let rule = args.rule;
|
|
441
|
+
if (args.ruleId && !rule) {
|
|
442
|
+
rule = initialRules.find((r) => r.id === args.ruleId);
|
|
443
|
+
}
|
|
444
|
+
if (!rule) {
|
|
445
|
+
return {
|
|
446
|
+
content: [{ type: "text", text: JSON.stringify({ error: 'Rule not found. Provide either "rule" object or "ruleId" of a pre-loaded rule.' }) }],
|
|
447
|
+
isError: true
|
|
448
|
+
};
|
|
449
|
+
}
|
|
431
450
|
const id = typeof rule["id"] === "string" ? rule["id"] : "unknown";
|
|
432
451
|
const modelName = typeof rule["model"] === "string" ? rule["model"] : "";
|
|
433
452
|
const params = rule["params"];
|
|
434
453
|
const checksum = typeof rule["checksum"] === "string" ? rule["checksum"] : "";
|
|
435
454
|
const computed = createHash4("sha256").update(JSON.stringify(params)).digest("hex");
|
|
436
455
|
const checksumMatch = computed === checksum;
|
|
437
|
-
const model =
|
|
456
|
+
const model = models.get(modelName);
|
|
438
457
|
const modelFound = model !== void 0;
|
|
439
458
|
let paramErrors;
|
|
440
459
|
if (model) {
|
|
@@ -443,7 +462,7 @@ function registerInspectRuleTool(server2, models2, descriptors2) {
|
|
|
443
462
|
paramErrors = [...validation.errors];
|
|
444
463
|
}
|
|
445
464
|
}
|
|
446
|
-
const extensionErrors = buildValidateExtensionErrors(rule,
|
|
465
|
+
const extensionErrors = buildValidateExtensionErrors(rule, descriptors);
|
|
447
466
|
const now = /* @__PURE__ */ new Date();
|
|
448
467
|
const effectiveFrom = typeof rule["effectiveFrom"] === "string" ? new Date(rule["effectiveFrom"]) : null;
|
|
449
468
|
const effectiveUntil = typeof rule["effectiveUntil"] === "string" ? new Date(rule["effectiveUntil"]) : null;
|
|
@@ -507,8 +526,8 @@ var EvaluationResultSchema = {
|
|
|
507
526
|
}).optional()
|
|
508
527
|
}).describe("An EvaluationResult (or simplified result from the evaluate tool)")
|
|
509
528
|
};
|
|
510
|
-
function registerExplainResultTool(
|
|
511
|
-
|
|
529
|
+
function registerExplainResultTool(server) {
|
|
530
|
+
server.tool(
|
|
512
531
|
"explain_result",
|
|
513
532
|
"Generate a human-readable explanation of an evaluation result. Summarizes the total value, applied rules with their contributions, skipped rules with reasons, and execution timing.",
|
|
514
533
|
EvaluationResultSchema,
|
|
@@ -573,8 +592,8 @@ var ScenarioSchema = z7.object({
|
|
|
573
592
|
})
|
|
574
593
|
})
|
|
575
594
|
});
|
|
576
|
-
function registerSimulateTool(
|
|
577
|
-
|
|
595
|
+
function registerSimulateTool(server, engine, initialRules = []) {
|
|
596
|
+
server.tool(
|
|
578
597
|
"simulate",
|
|
579
598
|
"Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.",
|
|
580
599
|
{
|
|
@@ -583,7 +602,7 @@ function registerSimulateTool(server2, engine2) {
|
|
|
583
602
|
},
|
|
584
603
|
async (args) => {
|
|
585
604
|
try {
|
|
586
|
-
const rules = hydrateRules2(args.rules);
|
|
605
|
+
const rules = hydrateRules2([...initialRules, ...args.rules || []]);
|
|
587
606
|
const results = [];
|
|
588
607
|
for (const scenario of args.scenarios) {
|
|
589
608
|
const input = {
|
|
@@ -594,7 +613,7 @@ function registerSimulateTool(server2, engine2) {
|
|
|
594
613
|
effectiveDate: scenario.input.meta.effectiveDate ? new Date(scenario.input.meta.effectiveDate) : void 0
|
|
595
614
|
}
|
|
596
615
|
};
|
|
597
|
-
const result = await
|
|
616
|
+
const result = await engine.evaluate(rules, input);
|
|
598
617
|
results.push({
|
|
599
618
|
label: scenario.label,
|
|
600
619
|
value: result.value,
|
|
@@ -622,11 +641,11 @@ function registerSimulateTool(server2, engine2) {
|
|
|
622
641
|
}
|
|
623
642
|
|
|
624
643
|
// src/resources/models.ts
|
|
625
|
-
function buildModelsCatalog(
|
|
644
|
+
function buildModelsCatalog(models) {
|
|
626
645
|
const lines = [];
|
|
627
646
|
lines.push("# Run-IQ Calculation Models");
|
|
628
647
|
lines.push("");
|
|
629
|
-
for (const [, model] of
|
|
648
|
+
for (const [, model] of models) {
|
|
630
649
|
lines.push(`## ${model.name} (v${model.version})`);
|
|
631
650
|
lines.push("");
|
|
632
651
|
const validation = model.validateParams({});
|
|
@@ -694,15 +713,15 @@ function buildModelsCatalog(models2) {
|
|
|
694
713
|
}
|
|
695
714
|
return lines.join("\n");
|
|
696
715
|
}
|
|
697
|
-
function registerModelsResource(
|
|
698
|
-
|
|
716
|
+
function registerModelsResource(server, models) {
|
|
717
|
+
server.resource(
|
|
699
718
|
"models-catalog",
|
|
700
719
|
"models://catalog",
|
|
701
720
|
{
|
|
702
721
|
description: "Documentation of all available calculation models with parameter schemas and usage examples"
|
|
703
722
|
},
|
|
704
723
|
() => {
|
|
705
|
-
const catalog = buildModelsCatalog(
|
|
724
|
+
const catalog = buildModelsCatalog(models);
|
|
706
725
|
return {
|
|
707
726
|
contents: [
|
|
708
727
|
{
|
|
@@ -717,16 +736,16 @@ function registerModelsResource(server2, models2) {
|
|
|
717
736
|
}
|
|
718
737
|
|
|
719
738
|
// src/resources/plugins.ts
|
|
720
|
-
function registerPluginsResource(
|
|
721
|
-
|
|
739
|
+
function registerPluginsResource(server, plugins, dsls, registry) {
|
|
740
|
+
server.resource(
|
|
722
741
|
"plugins-loaded",
|
|
723
742
|
"plugins://loaded",
|
|
724
743
|
{ description: "Information about loaded plugins, DSL evaluators, and their descriptors" },
|
|
725
744
|
() => {
|
|
726
|
-
const
|
|
745
|
+
const descriptors = registry.getAll();
|
|
727
746
|
const info = {
|
|
728
|
-
plugins:
|
|
729
|
-
const desc =
|
|
747
|
+
plugins: plugins.map((p) => {
|
|
748
|
+
const desc = descriptors.find((d) => d.name === p.name);
|
|
730
749
|
const pluginWithModels = p;
|
|
731
750
|
return {
|
|
732
751
|
name: p.name,
|
|
@@ -736,7 +755,7 @@ function registerPluginsResource(server2, plugins2, dsls2, registry) {
|
|
|
736
755
|
ruleExtensions: desc?.ruleExtensions.map((f) => f.name) ?? []
|
|
737
756
|
};
|
|
738
757
|
}),
|
|
739
|
-
dsls:
|
|
758
|
+
dsls: dsls.map((d) => ({
|
|
740
759
|
name: d.dsl,
|
|
741
760
|
version: d.version
|
|
742
761
|
}))
|
|
@@ -755,7 +774,7 @@ function registerPluginsResource(server2, plugins2, dsls2, registry) {
|
|
|
755
774
|
}
|
|
756
775
|
|
|
757
776
|
// src/resources/schema.ts
|
|
758
|
-
function buildSchemaDocument(
|
|
777
|
+
function buildSchemaDocument(models, registry) {
|
|
759
778
|
const lines = [];
|
|
760
779
|
lines.push("# Run-IQ Rule Schema");
|
|
761
780
|
lines.push("");
|
|
@@ -778,11 +797,11 @@ function buildSchemaDocument(models2, registry) {
|
|
|
778
797
|
lines.push("| checksum | string | auto | SHA-256 of params (auto-computed by create_rule) |");
|
|
779
798
|
lines.push("| condition | {dsl,value} | optional | DSL condition (e.g. jsonlogic) |");
|
|
780
799
|
lines.push("");
|
|
781
|
-
const
|
|
782
|
-
if (
|
|
800
|
+
const descriptors = registry.getAll();
|
|
801
|
+
if (descriptors.length > 0) {
|
|
783
802
|
lines.push("## Plugin Extension Fields");
|
|
784
803
|
lines.push("");
|
|
785
|
-
for (const desc of
|
|
804
|
+
for (const desc of descriptors) {
|
|
786
805
|
lines.push(`### ${desc.name} (v${desc.version})`);
|
|
787
806
|
lines.push("");
|
|
788
807
|
lines.push(desc.description);
|
|
@@ -800,7 +819,7 @@ function buildSchemaDocument(models2, registry) {
|
|
|
800
819
|
}
|
|
801
820
|
lines.push("## Available Calculation Models");
|
|
802
821
|
lines.push("");
|
|
803
|
-
for (const [, model] of
|
|
822
|
+
for (const [, model] of models) {
|
|
804
823
|
lines.push(`### ${model.name} (v${model.version})`);
|
|
805
824
|
lines.push("");
|
|
806
825
|
const validation = model.validateParams({});
|
|
@@ -867,8 +886,8 @@ function buildSchemaDocument(models2, registry) {
|
|
|
867
886
|
}
|
|
868
887
|
return lines.join("\n");
|
|
869
888
|
}
|
|
870
|
-
function registerSchemaResource(
|
|
871
|
-
|
|
889
|
+
function registerSchemaResource(server, models, registry) {
|
|
890
|
+
server.resource(
|
|
872
891
|
"rule-schema",
|
|
873
892
|
"schema://rules",
|
|
874
893
|
{
|
|
@@ -879,7 +898,7 @@ function registerSchemaResource(server2, models2, registry) {
|
|
|
879
898
|
{
|
|
880
899
|
uri: "schema://rules",
|
|
881
900
|
mimeType: "text/markdown",
|
|
882
|
-
text: buildSchemaDocument(
|
|
901
|
+
text: buildSchemaDocument(models, registry)
|
|
883
902
|
}
|
|
884
903
|
]
|
|
885
904
|
})
|
|
@@ -889,13 +908,13 @@ function registerSchemaResource(server2, models2, registry) {
|
|
|
889
908
|
// src/prompts/analyze-text.ts
|
|
890
909
|
import { z as z8 } from "zod";
|
|
891
910
|
function buildDomainLabel(registry) {
|
|
892
|
-
const
|
|
893
|
-
if (
|
|
894
|
-
return
|
|
911
|
+
const descriptors = registry.getAll();
|
|
912
|
+
if (descriptors.length === 0) return "policy";
|
|
913
|
+
return descriptors.map((d) => d.domainLabel).join(" / ");
|
|
895
914
|
}
|
|
896
|
-
function buildModelDocs(
|
|
915
|
+
function buildModelDocs(models) {
|
|
897
916
|
const lines = [];
|
|
898
|
-
for (const [, model] of
|
|
917
|
+
for (const [, model] of models) {
|
|
899
918
|
const validation = model.validateParams({});
|
|
900
919
|
const paramHints = validation.errors ? validation.errors.join("; ") : "none";
|
|
901
920
|
lines.push(`- **${model.name}** (v${model.version}): ${paramHints}`);
|
|
@@ -903,10 +922,10 @@ function buildModelDocs(models2) {
|
|
|
903
922
|
return lines.join("\n");
|
|
904
923
|
}
|
|
905
924
|
function buildExtensionDocs(registry) {
|
|
906
|
-
const
|
|
907
|
-
if (
|
|
925
|
+
const descriptors = registry.getAll();
|
|
926
|
+
if (descriptors.length === 0) return "";
|
|
908
927
|
const lines = [];
|
|
909
|
-
for (const desc of
|
|
928
|
+
for (const desc of descriptors) {
|
|
910
929
|
lines.push(`
|
|
911
930
|
### Plugin: ${desc.name}`);
|
|
912
931
|
lines.push(desc.description);
|
|
@@ -946,9 +965,9 @@ function buildInputDocs(registry) {
|
|
|
946
965
|
return lines.join("\n");
|
|
947
966
|
}
|
|
948
967
|
function buildGuidelinesSection(registry) {
|
|
949
|
-
const
|
|
968
|
+
const descriptors = registry.getAll();
|
|
950
969
|
const lines = [];
|
|
951
|
-
for (const desc of
|
|
970
|
+
for (const desc of descriptors) {
|
|
952
971
|
if (desc.promptGuidelines.length > 0) {
|
|
953
972
|
lines.push(`
|
|
954
973
|
## ${desc.domainLabel} Guidelines`);
|
|
@@ -959,9 +978,9 @@ function buildGuidelinesSection(registry) {
|
|
|
959
978
|
}
|
|
960
979
|
return lines.join("\n");
|
|
961
980
|
}
|
|
962
|
-
function registerAnalyzeTextPrompt(
|
|
981
|
+
function registerAnalyzeTextPrompt(server, models, registry) {
|
|
963
982
|
const domainLabel = buildDomainLabel(registry);
|
|
964
|
-
|
|
983
|
+
server.prompt(
|
|
965
984
|
"analyze-text",
|
|
966
985
|
`Translate a ${domainLabel} text (law, regulation, policy) into Run-IQ rule definitions. Plugin-aware: includes all required fields.`,
|
|
967
986
|
{
|
|
@@ -978,7 +997,7 @@ function registerAnalyzeTextPrompt(server2, models2, registry) {
|
|
|
978
997
|
text: `You are an expert at translating regulatory and policy texts into structured Run-IQ rules.
|
|
979
998
|
|
|
980
999
|
## Available Calculation Models
|
|
981
|
-
${buildModelDocs(
|
|
1000
|
+
${buildModelDocs(models)}
|
|
982
1001
|
${buildExtensionDocs(registry)}
|
|
983
1002
|
${buildInputDocs(registry)}
|
|
984
1003
|
${buildGuidelinesSection(registry)}
|
|
@@ -1012,9 +1031,9 @@ ${args.source_text}`
|
|
|
1012
1031
|
// src/prompts/domain-expert.ts
|
|
1013
1032
|
import { z as z9 } from "zod";
|
|
1014
1033
|
function buildGuidelinesSection2(registry) {
|
|
1015
|
-
const
|
|
1034
|
+
const descriptors = registry.getAll();
|
|
1016
1035
|
const allGuidelines = [];
|
|
1017
|
-
for (const desc of
|
|
1036
|
+
for (const desc of descriptors) {
|
|
1018
1037
|
if (desc.promptGuidelines.length > 0) {
|
|
1019
1038
|
allGuidelines.push(`### ${desc.name} (${desc.domainLabel})`);
|
|
1020
1039
|
for (const g of desc.promptGuidelines) {
|
|
@@ -1027,15 +1046,15 @@ function buildGuidelinesSection2(registry) {
|
|
|
1027
1046
|
${allGuidelines.join("\n")}`;
|
|
1028
1047
|
}
|
|
1029
1048
|
function buildDomainLabel2(registry) {
|
|
1030
|
-
const
|
|
1031
|
-
if (
|
|
1032
|
-
return
|
|
1049
|
+
const descriptors = registry.getAll();
|
|
1050
|
+
if (descriptors.length === 0) return "general-purpose";
|
|
1051
|
+
return descriptors.map((d) => d.domainLabel).join(" + ");
|
|
1033
1052
|
}
|
|
1034
|
-
function registerDomainExpertPrompt(
|
|
1035
|
-
const
|
|
1053
|
+
function registerDomainExpertPrompt(server, registry) {
|
|
1054
|
+
const descriptors = registry.getAll();
|
|
1036
1055
|
const domainLabel = buildDomainLabel2(registry);
|
|
1037
|
-
const pluginList =
|
|
1038
|
-
|
|
1056
|
+
const pluginList = descriptors.map((d) => `- ${d.name}: ${d.description}`).join("\n");
|
|
1057
|
+
server.prompt(
|
|
1039
1058
|
"domain-expert",
|
|
1040
1059
|
`${domainLabel} calculation expertise: scenario comparison, result explanation, recommendations`,
|
|
1041
1060
|
{
|
|
@@ -1088,7 +1107,7 @@ ${args.question}`
|
|
|
1088
1107
|
// package.json
|
|
1089
1108
|
var package_default = {
|
|
1090
1109
|
name: "@run-iq/mcp-server",
|
|
1091
|
-
version: "0.1.
|
|
1110
|
+
version: "0.1.9",
|
|
1092
1111
|
description: "MCP server exposing the PPE engine to LLMs via stdio",
|
|
1093
1112
|
type: "module",
|
|
1094
1113
|
main: "./dist/index.js",
|
|
@@ -1148,55 +1167,85 @@ var package_default = {
|
|
|
1148
1167
|
var VERSION = package_default.version;
|
|
1149
1168
|
|
|
1150
1169
|
// src/index.ts
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
i
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
if (
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
},
|
|
1179
|
-
{
|
|
1180
|
-
capabilities: {
|
|
1181
|
-
tools: {},
|
|
1182
|
-
resources: {},
|
|
1183
|
-
prompts: {}
|
|
1170
|
+
async function main() {
|
|
1171
|
+
try {
|
|
1172
|
+
let pluginsDir;
|
|
1173
|
+
let rulesPath;
|
|
1174
|
+
const npmPlugins = [];
|
|
1175
|
+
const argv = process.argv.slice(2);
|
|
1176
|
+
for (let i = 0; i < argv.length; i++) {
|
|
1177
|
+
if (argv[i] === "--plugins-dir" && argv[i + 1]) {
|
|
1178
|
+
pluginsDir = argv[i + 1];
|
|
1179
|
+
i++;
|
|
1180
|
+
} else if (argv[i] === "--plugin" && argv[i + 1]) {
|
|
1181
|
+
npmPlugins.push(argv[i + 1]);
|
|
1182
|
+
i++;
|
|
1183
|
+
} else if (argv[i] === "--rules" && argv[i + 1]) {
|
|
1184
|
+
rulesPath = argv[i + 1];
|
|
1185
|
+
i++;
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
const bundles = [];
|
|
1189
|
+
const initialRules = [];
|
|
1190
|
+
if (pluginsDir) {
|
|
1191
|
+
const dirBundles = await loadPluginsFromDir(pluginsDir);
|
|
1192
|
+
bundles.push(...dirBundles);
|
|
1193
|
+
}
|
|
1194
|
+
if (npmPlugins.length > 0) {
|
|
1195
|
+
const npmBundles = await loadNpmPlugins(npmPlugins);
|
|
1196
|
+
bundles.push(...npmBundles);
|
|
1184
1197
|
}
|
|
1198
|
+
const { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);
|
|
1199
|
+
const descriptors = descriptorRegistry.getAll();
|
|
1200
|
+
if (rulesPath) {
|
|
1201
|
+
try {
|
|
1202
|
+
const fullPath = path2.resolve(process.cwd(), rulesPath);
|
|
1203
|
+
const rulesContent = await fs.readFile(fullPath, "utf-8");
|
|
1204
|
+
const loadedRules = JSON.parse(rulesContent);
|
|
1205
|
+
if (Array.isArray(loadedRules)) {
|
|
1206
|
+
initialRules.push(...loadedRules);
|
|
1207
|
+
console.error(`[MCP] Pre-loaded ${initialRules.length} rules from: ${rulesPath}`);
|
|
1208
|
+
}
|
|
1209
|
+
} catch (err) {
|
|
1210
|
+
console.error(`[MCP] Failed to pre-load rules from "${rulesPath}":`, err instanceof Error ? err.message : err);
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
const server = new McpServer(
|
|
1214
|
+
{
|
|
1215
|
+
name: "@run-iq/mcp-server",
|
|
1216
|
+
version: VERSION
|
|
1217
|
+
},
|
|
1218
|
+
{
|
|
1219
|
+
capabilities: {
|
|
1220
|
+
tools: {},
|
|
1221
|
+
resources: {},
|
|
1222
|
+
prompts: {}
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
);
|
|
1226
|
+
registerCreateChecksumTool(server);
|
|
1227
|
+
registerCreateRuleTool(server, descriptors);
|
|
1228
|
+
registerValidateRulesTool(server, models, descriptors, initialRules);
|
|
1229
|
+
registerListModelsTool(server, models);
|
|
1230
|
+
registerEvaluateTool(server, engine, initialRules);
|
|
1231
|
+
registerInspectRuleTool(server, models, descriptors, initialRules);
|
|
1232
|
+
registerExplainResultTool(server);
|
|
1233
|
+
registerSimulateTool(server, engine, initialRules);
|
|
1234
|
+
registerModelsResource(server, models);
|
|
1235
|
+
registerPluginsResource(server, plugins, dsls, descriptorRegistry);
|
|
1236
|
+
registerSchemaResource(server, models, descriptorRegistry);
|
|
1237
|
+
registerAnalyzeTextPrompt(server, models, descriptorRegistry);
|
|
1238
|
+
registerDomainExpertPrompt(server, descriptorRegistry);
|
|
1239
|
+
const transport = new StdioServerTransport();
|
|
1240
|
+
await server.connect(transport);
|
|
1241
|
+
console.error(`[MCP] Server v${VERSION} started successfully with ${bundles.length} plugins.`);
|
|
1242
|
+
} catch (error) {
|
|
1243
|
+
console.error("[MCP] Fatal error during startup:", error);
|
|
1244
|
+
process.exit(1);
|
|
1185
1245
|
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
registerEvaluateTool(server, engine);
|
|
1192
|
-
registerInspectRuleTool(server, models, descriptors);
|
|
1193
|
-
registerExplainResultTool(server);
|
|
1194
|
-
registerSimulateTool(server, engine);
|
|
1195
|
-
registerModelsResource(server, models);
|
|
1196
|
-
registerPluginsResource(server, plugins, dsls, descriptorRegistry);
|
|
1197
|
-
registerSchemaResource(server, models, descriptorRegistry);
|
|
1198
|
-
registerAnalyzeTextPrompt(server, models, descriptorRegistry);
|
|
1199
|
-
registerDomainExpertPrompt(server, descriptorRegistry);
|
|
1200
|
-
var transport = new StdioServerTransport();
|
|
1201
|
-
await server.connect(transport);
|
|
1246
|
+
}
|
|
1247
|
+
main().catch((err) => {
|
|
1248
|
+
console.error("[MCP] Unhandled promise rejection during startup:", err);
|
|
1249
|
+
process.exit(1);
|
|
1250
|
+
});
|
|
1202
1251
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/engine.ts","../src/descriptors/registry.ts","../src/loader/plugin-loader.ts","../src/tools/create-checksum.ts","../src/tools/create-rule.ts","../src/tools/schema-builder.ts","../src/tools/validate.ts","../src/tools/list-models.ts","../src/tools/evaluate.ts","../src/tools/inspect-rule.ts","../src/tools/explain.ts","../src/tools/simulate.ts","../src/resources/models.ts","../src/resources/plugins.ts","../src/resources/schema.ts","../src/prompts/analyze-text.ts","../src/prompts/domain-expert.ts","../package.json","../src/utils/version.ts"],"sourcesContent":["import type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createEngine } from './engine.js';\nimport { loadPluginsFromDir, loadNpmPlugins } from './loader/plugin-loader.js';\nimport { registerCreateChecksumTool } from './tools/create-checksum.js';\nimport { registerCreateRuleTool } from './tools/create-rule.js';\nimport { registerValidateRulesTool } from './tools/validate.js';\nimport { registerListModelsTool } from './tools/list-models.js';\nimport { registerEvaluateTool } from './tools/evaluate.js';\nimport { registerInspectRuleTool } from './tools/inspect-rule.js';\nimport { registerExplainResultTool } from './tools/explain.js';\nimport { registerSimulateTool } from './tools/simulate.js';\nimport { registerModelsResource } from './resources/models.js';\nimport { registerPluginsResource } from './resources/plugins.js';\nimport { registerSchemaResource } from './resources/schema.js';\nimport { registerAnalyzeTextPrompt } from './prompts/analyze-text.js';\nimport { registerDomainExpertPrompt } from './prompts/domain-expert.js';\nimport { VERSION } from './utils/version.js';\n\n// Parse CLI arguments\nlet pluginsDir: string | undefined;\nconst npmPlugins: string[] = [];\nconst argv = process.argv.slice(2);\nfor (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--plugins-dir' && argv[i + 1]) {\n pluginsDir = argv[i + 1];\n i++;\n } else if (argv[i] === '--plugin' && argv[i + 1]) {\n npmPlugins.push(argv[i + 1]!);\n i++;\n }\n}\n\n// Load plugin bundles\nconst bundles: PluginBundle[] = [];\nif (pluginsDir) {\n const dirBundles = await loadPluginsFromDir(pluginsDir);\n bundles.push(...dirBundles);\n}\nif (npmPlugins.length > 0) {\n const npmBundles = await loadNpmPlugins(npmPlugins);\n bundles.push(...npmBundles);\n}\n\nconst { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);\nconst descriptors = descriptorRegistry.getAll();\n\nconst server = new McpServer(\n {\n name: '@run-iq/mcp-server',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n);\n\n// Tools\nregisterCreateChecksumTool(server);\nregisterCreateRuleTool(server, descriptors);\nregisterValidateRulesTool(server, models, descriptors);\nregisterListModelsTool(server, models);\nregisterEvaluateTool(server, engine);\nregisterInspectRuleTool(server, models, descriptors);\nregisterExplainResultTool(server);\nregisterSimulateTool(server, engine);\n\n// Resources\nregisterModelsResource(server, models);\nregisterPluginsResource(server, plugins, dsls, descriptorRegistry);\nregisterSchemaResource(server, models, descriptorRegistry);\n\n// Prompts\nregisterAnalyzeTextPrompt(server, models, descriptorRegistry);\nregisterDomainExpertPrompt(server, descriptorRegistry);\n\n// Start stdio transport\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n","import { PPEEngine } from '@run-iq/core';\nimport type { PPEPlugin, DSLEvaluator, CalculationModel } from '@run-iq/core';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { DescriptorRegistry } from './descriptors/registry.js';\n\nexport interface EngineContext {\n readonly engine: PPEEngine;\n readonly models: ReadonlyMap<string, CalculationModel>;\n readonly descriptorRegistry: DescriptorRegistry;\n readonly plugins: readonly PPEPlugin[];\n readonly dsls: readonly DSLEvaluator[];\n}\n\nexport function createEngine(bundles?: readonly PluginBundle[]): EngineContext {\n const descriptorRegistry = new DescriptorRegistry();\n const allPlugins: PPEPlugin[] = [];\n const allDsls: DSLEvaluator[] = [];\n\n if (bundles && bundles.length > 0) {\n for (const bundle of bundles) {\n allPlugins.push(bundle.plugin);\n descriptorRegistry.register(bundle.descriptor);\n if (bundle.dsls) {\n allDsls.push(...bundle.dsls);\n }\n }\n }\n\n const engine = new PPEEngine({\n plugins: allPlugins,\n dsls: allDsls,\n dryRun: true,\n strict: false,\n onConflict: 'first',\n onChecksumMismatch: 'skip',\n });\n\n // Build model map from plugins that expose a models property (BasePlugin pattern)\n const models = new Map<string, CalculationModel>();\n for (const plugin of allPlugins) {\n const pluginWithModels = plugin as { models?: CalculationModel[] };\n if (Array.isArray(pluginWithModels.models)) {\n for (const model of pluginWithModels.models) {\n models.set(model.name, model);\n }\n }\n }\n\n return { engine, models, descriptorRegistry, plugins: allPlugins, dsls: allDsls };\n}\n","import type {\n PluginDescriptor,\n RuleFieldDescriptor,\n InputFieldDescriptor,\n RuleExample,\n} from '@run-iq/plugin-sdk';\n\nexport class DescriptorRegistry {\n private readonly descriptors: PluginDescriptor[] = [];\n\n register(descriptor: PluginDescriptor): void {\n this.descriptors.push(descriptor);\n }\n\n getAll(): readonly PluginDescriptor[] {\n return this.descriptors;\n }\n\n getRuleExtensions(): readonly RuleFieldDescriptor[] {\n return this.descriptors.flatMap((d) => d.ruleExtensions);\n }\n\n getInputFields(): readonly InputFieldDescriptor[] {\n const seen = new Set<string>();\n const fields: InputFieldDescriptor[] = [];\n for (const d of this.descriptors) {\n for (const f of d.inputFields) {\n if (!seen.has(f.name)) {\n seen.add(f.name);\n fields.push(f);\n }\n }\n }\n return fields;\n }\n\n getExamples(): readonly RuleExample[] {\n return this.descriptors.flatMap((d) => d.examples);\n }\n\n isEmpty(): boolean {\n return this.descriptors.length === 0;\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createRequire } from 'node:module';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\n\nconst require = createRequire(import.meta.url);\n\nexport async function loadPluginsFromDir(dir: string): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n const absoluteDir = resolve(dir);\n const entries = await readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n if (!entry.name.endsWith('.js') && !entry.name.endsWith('.mjs')) continue;\n\n const filePath = resolve(absoluteDir, entry.name);\n const mod: Record<string, unknown> = await import(filePath);\n\n const bundle = (mod['default'] ?? mod) as Record<string, unknown>;\n\n if (\n bundle['plugin'] &&\n typeof bundle['plugin'] === 'object' &&\n bundle['descriptor'] &&\n typeof bundle['descriptor'] === 'object'\n ) {\n bundles.push(bundle as unknown as PluginBundle);\n }\n }\n\n return bundles;\n}\n\nexport async function loadNpmPlugins(packageNames: string[]): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n\n for (const pkgName of packageNames) {\n try {\n const resolvedPath = require.resolve(pkgName, { paths: [process.cwd()] });\n const mod = await import(pathToFileURL(resolvedPath).href);\n\n // Handle various export patterns (ESM default, CJS module.exports, or named 'bundle')\n const bundle = (mod['default'] ?? mod['bundle'] ?? mod) as Record<string, unknown>;\n\n if (bundle && typeof bundle === 'object' && bundle['plugin'] && bundle['descriptor']) {\n bundles.push(bundle as unknown as PluginBundle);\n } else {\n // eslint-disable-next-line no-console\n console.error(\n `[MCP] Invalid PluginBundle exported by NPM package \"${pkgName}\". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`,\n );\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[MCP] Failed to load NPM plugin: ${pkgName}`, err);\n }\n }\n\n return bundles;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport function registerCreateChecksumTool(server: McpServer): void {\n server.tool(\n 'create_checksum',\n 'Compute the SHA-256 checksum of a params object. Used to generate the checksum field for Run-IQ rules.',\n { params: z.record(z.unknown()).describe('The params object to hash') },\n (args) => {\n const checksum = createHash('sha256').update(JSON.stringify(args.params)).digest('hex');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ checksum }, null, 2) }],\n };\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildCreateRuleSchema } from './schema-builder.js';\n\nexport function registerCreateRuleTool(\n server: McpServer,\n descriptors: readonly PluginDescriptor[],\n): void {\n const schema = buildCreateRuleSchema(descriptors);\n\n // Collect plugin extension field names\n const extensionFields = descriptors.flatMap((d) => d.ruleExtensions.map((f) => f.name));\n\n server.tool(\n 'create_rule',\n 'Generate a valid Run-IQ Rule JSON object with auto-computed SHA-256 checksum. Includes plugin-specific fields based on loaded plugins.',\n schema,\n (args: Record<string, unknown>) => {\n const params = args['params'] as Record<string, unknown>;\n const checksum = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n\n const rule: Record<string, unknown> = {\n id: args['id'],\n version: 1,\n model: args['model'],\n params,\n priority: (args['priority'] as number | undefined) ?? 1000,\n effectiveFrom: args['effectiveFrom'],\n effectiveUntil: args['effectiveUntil'] ?? null,\n tags: (args['tags'] as string[] | undefined) ?? [],\n checksum,\n };\n\n if (args['condition']) {\n rule['condition'] = args['condition'];\n }\n\n // Add plugin extension fields\n for (const field of extensionFields) {\n if (args[field] !== undefined) {\n rule[field] = args[field];\n }\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ rule }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { RuleFieldDescriptor, PluginDescriptor } from '@run-iq/plugin-sdk';\n\nfunction buildFieldSchema(field: RuleFieldDescriptor): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n if (field.enum && field.enum.length > 0) {\n schema = z.enum(field.enum as [string, ...string[]]);\n } else {\n switch (field.type) {\n case 'string':\n schema = z.string();\n break;\n case 'number':\n schema = z.number();\n break;\n case 'boolean':\n schema = z.boolean();\n break;\n }\n }\n\n if (!field.required) {\n schema = schema.optional();\n }\n\n return schema.describe(field.description);\n}\n\nexport function buildCreateRuleSchema(\n descriptors: readonly PluginDescriptor[],\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {\n id: z.string().describe('Unique rule identifier'),\n model: z.string().describe('Calculation model name (e.g. FLAT_RATE, PROGRESSIVE_BRACKET)'),\n params: z.record(z.unknown()).describe('Model-specific parameters'),\n priority: z\n .number()\n .int()\n .optional()\n .describe('Rule priority (may be auto-computed by plugins, e.g. from jurisdiction+scope)'),\n effectiveFrom: z.string().describe('ISO 8601 date string for when the rule becomes active'),\n effectiveUntil: z\n .string()\n .nullable()\n .optional()\n .describe('ISO 8601 date string for when the rule expires (null = no expiry)'),\n tags: z.array(z.string()).optional().describe('Optional tags for filtering'),\n condition: z\n .object({\n dsl: z.string().describe('DSL identifier (e.g. \"jsonlogic\")'),\n value: z.unknown().describe('DSL-specific condition expression'),\n })\n .optional()\n .describe('Optional condition expression'),\n };\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n shape[field.name] = buildFieldSchema(field);\n }\n }\n\n return shape;\n}\n\nexport function buildValidateExtensionErrors(\n rule: Record<string, unknown>,\n descriptors: readonly PluginDescriptor[],\n): string[] {\n const errors: string[] = [];\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n const value = rule[field.name];\n\n if (field.required && (value === undefined || value === null)) {\n errors.push(`\"${field.name}\" is required by ${descriptor.name}: ${field.description}`);\n continue;\n }\n\n if (value === undefined || value === null) continue;\n\n if (field.enum && !field.enum.includes(String(value))) {\n errors.push(\n `\"${field.name}\" must be one of: ${field.enum.join(', ')} (got \"${String(value)}\")`,\n );\n }\n\n if (field.type === 'string' && typeof value !== 'string') {\n errors.push(`\"${field.name}\" must be a string`);\n }\n if (field.type === 'number' && typeof value !== 'number') {\n errors.push(`\"${field.name}\" must be a number`);\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors.push(`\"${field.name}\" must be a boolean`);\n }\n }\n }\n\n return errors;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nconst RuleSchema = z.object({\n id: z.string(),\n version: z.number(),\n model: z.string(),\n params: z.unknown(),\n priority: z.number().optional(),\n effectiveFrom: z.string(),\n effectiveUntil: z.string().nullable(),\n tags: z.array(z.string()),\n checksum: z.string(),\n condition: z.object({ dsl: z.string(), value: z.unknown() }).optional(),\n});\n\ninterface ValidationEntry {\n ruleId: string;\n valid: boolean;\n errors?: string[];\n}\n\nexport function registerValidateRulesTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n): void {\n server.tool(\n 'validate_rules',\n 'Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.',\n {\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects to validate'),\n },\n (args) => {\n const entries: ValidationEntry[] = [];\n\n for (const raw of args.rules) {\n const parsed = RuleSchema.safeParse(raw);\n const ruleId = typeof raw['id'] === 'string' ? raw['id'] : 'unknown';\n\n if (!parsed.success) {\n entries.push({\n ruleId,\n valid: false,\n errors: parsed.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`),\n });\n continue;\n }\n\n const rule = parsed.data;\n const errors: string[] = [];\n\n // Checksum verification\n const computed = createHash('sha256').update(JSON.stringify(rule.params)).digest('hex');\n if (computed !== rule.checksum) {\n errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);\n }\n\n // Model existence\n const model = models.get(rule.model);\n if (!model) {\n errors.push(\n `Model \"${rule.model}\" not found. Available: ${[...models.keys()].join(', ')}`,\n );\n } else {\n // Param validation via model\n const validation = model.validateParams(rule.params);\n if (!validation.valid && validation.errors) {\n errors.push(...validation.errors);\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(raw, descriptors);\n errors.push(...extensionErrors);\n\n entries.push({\n ruleId: rule.id,\n valid: errors.length === 0,\n ...(errors.length > 0 ? { errors } : {}),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ entries }, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\ninterface ModelInfo {\n name: string;\n version: string;\n paramsSchema: Record<string, string>;\n}\n\nexport function registerListModelsTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.tool(\n 'list_models',\n 'List all available calculation models with their parameter schemas. Shows model name, version, and expected parameters.',\n {},\n () => {\n const result: ModelInfo[] = [];\n\n for (const [, model] of models) {\n // Infer param schema from validation errors with empty object\n const validation = model.validateParams({});\n const paramsSchema: Record<string, string> = {};\n\n if (validation.errors) {\n for (const error of validation.errors) {\n // Parse error messages like '\"rate\" must be a number' or '\"base\" must be a string'\n const match = error.match(/^\"(\\w+)\"\\s+must be (?:a |an )?(.+)$/);\n if (match?.[1] && match[2]) {\n paramsSchema[match[1]] = match[2];\n }\n }\n }\n\n result.push({\n name: model.name,\n version: model.version,\n paramsSchema,\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ models: result }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nexport function registerEvaluateTool(server: McpServer, engine: PPEEngine): void {\n server.tool(\n 'evaluate',\n 'Evaluate Run-IQ rules against input data in dry-run mode. Returns the computed value, breakdown per rule, applied/skipped rules, and execution trace.',\n {\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects'),\n input: z\n .object({\n data: z.record(z.unknown()).describe('Input data for evaluation'),\n requestId: z.string().describe('Unique request identifier'),\n meta: z.object({\n tenantId: z.string().describe('Tenant identifier'),\n userId: z.string().optional().describe('User identifier'),\n tags: z.array(z.string()).optional().describe('Tags for rule filtering'),\n context: z.record(z.unknown()).optional().describe('Additional context'),\n effectiveDate: z\n .string()\n .optional()\n .describe('ISO 8601 date for effective date evaluation'),\n }),\n })\n .describe('Evaluation input'),\n },\n async (args) => {\n try {\n const rules = hydrateRules(args.rules);\n\n const input = {\n data: args.input.data,\n requestId: args.input.requestId,\n meta: {\n ...args.input.meta,\n effectiveDate: args.input.meta.effectiveDate\n ? new Date(args.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n const serializable = {\n value: result.value,\n breakdown: result.breakdown,\n appliedRules: result.appliedRules.map((r) => ({\n id: r.id,\n model: r.model,\n priority: r.priority,\n })),\n skippedRules: result.skippedRules.map((s) => ({\n ruleId: s.rule.id,\n reason: s.reason,\n })),\n trace: {\n steps: result.trace.steps.map((s) => ({\n ruleId: s.ruleId,\n modelUsed: s.modelUsed,\n contribution: s.contribution,\n durationMs: s.durationMs,\n })),\n totalDurationMs: result.trace.totalDurationMs,\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(serializable, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nexport function registerInspectRuleTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n): void {\n server.tool(\n 'inspect_rule',\n 'Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.',\n {\n rule: z.record(z.unknown()).describe('A single Rule JSON object to inspect'),\n },\n (args) => {\n const rule = args.rule;\n const id = typeof rule['id'] === 'string' ? rule['id'] : 'unknown';\n const modelName = typeof rule['model'] === 'string' ? rule['model'] : '';\n const params = rule['params'];\n const checksum = typeof rule['checksum'] === 'string' ? rule['checksum'] : '';\n\n // Checksum match\n const computed = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n const checksumMatch = computed === checksum;\n\n // Model found\n const model = models.get(modelName);\n const modelFound = model !== undefined;\n\n // Param validation\n let paramErrors: string[] | undefined;\n if (model) {\n const validation = model.validateParams(params);\n if (!validation.valid && validation.errors) {\n paramErrors = [...validation.errors];\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(rule, descriptors);\n\n // Active date check\n const now = new Date();\n const effectiveFrom =\n typeof rule['effectiveFrom'] === 'string' ? new Date(rule['effectiveFrom']) : null;\n const effectiveUntil =\n typeof rule['effectiveUntil'] === 'string' ? new Date(rule['effectiveUntil']) : null;\n\n const isActive =\n effectiveFrom !== null &&\n effectiveFrom <= now &&\n (effectiveUntil === null || effectiveUntil > now);\n\n const effectivePeriod = {\n from: effectiveFrom?.toISOString() ?? null,\n until: effectiveUntil?.toISOString() ?? null,\n };\n\n const allErrors = [...(paramErrors ?? []), ...extensionErrors];\n const valid = checksumMatch && modelFound && allErrors.length === 0 && isActive;\n\n const result: Record<string, unknown> = {\n ruleId: id,\n valid,\n checksumMatch,\n modelFound,\n isActive,\n effectivePeriod,\n };\n\n if (paramErrors && paramErrors.length > 0) {\n result['paramErrors'] = paramErrors;\n }\n if (extensionErrors.length > 0) {\n result['extensionErrors'] = extensionErrors;\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst EvaluationResultSchema = {\n result: z\n .object({\n value: z.unknown(),\n breakdown: z.array(\n z.object({\n ruleId: z.string(),\n contribution: z.unknown(),\n modelUsed: z.string(),\n label: z.string().optional(),\n }),\n ),\n appliedRules: z.array(\n z.object({\n id: z.string(),\n model: z.string(),\n priority: z.number(),\n }),\n ),\n skippedRules: z.array(\n z.object({\n ruleId: z.string(),\n reason: z.string(),\n }),\n ),\n trace: z\n .object({\n totalDurationMs: z.number(),\n steps: z.array(z.record(z.unknown())).optional(),\n })\n .optional(),\n })\n .describe('An EvaluationResult (or simplified result from the evaluate tool)'),\n};\n\nexport function registerExplainResultTool(server: McpServer): void {\n server.tool(\n 'explain_result',\n 'Generate a human-readable explanation of an evaluation result. Summarizes the total value, applied rules with their contributions, skipped rules with reasons, and execution timing.',\n EvaluationResultSchema,\n (args) => {\n const { result } = args;\n const lines: string[] = [];\n\n lines.push(`## Evaluation Result Summary`);\n lines.push('');\n lines.push(`**Total Value**: ${String(result.value)}`);\n lines.push('');\n\n // Applied rules\n if (result.appliedRules.length > 0) {\n lines.push(`### Applied Rules (${result.appliedRules.length})`);\n lines.push('');\n\n for (const applied of result.appliedRules) {\n const breakdown = result.breakdown.find((b) => b.ruleId === applied.id);\n const contribution = breakdown ? String(breakdown.contribution) : 'N/A';\n const label = breakdown?.label ? ` (${breakdown.label})` : '';\n\n lines.push(\n `- **${applied.id}**${label}: model=${applied.model}, priority=${applied.priority}, contribution=${contribution}`,\n );\n }\n lines.push('');\n } else {\n lines.push('### No rules were applied.');\n lines.push('');\n }\n\n // Skipped rules\n if (result.skippedRules.length > 0) {\n lines.push(`### Skipped Rules (${result.skippedRules.length})`);\n lines.push('');\n\n for (const skipped of result.skippedRules) {\n lines.push(`- **${skipped.ruleId}**: ${skipped.reason}`);\n }\n lines.push('');\n }\n\n // Timing\n if (result.trace?.totalDurationMs !== undefined) {\n lines.push(`### Timing`);\n lines.push('');\n lines.push(`Total duration: ${result.trace.totalDurationMs}ms`);\n }\n\n const explanation = lines.join('\\n');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ explanation }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nconst ScenarioSchema = z.object({\n label: z.string().describe('Human-readable scenario label'),\n input: z.object({\n data: z.record(z.unknown()),\n requestId: z.string(),\n meta: z.object({\n tenantId: z.string(),\n userId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n context: z.record(z.unknown()).optional(),\n effectiveDate: z.string().optional(),\n }),\n }),\n});\n\nexport function registerSimulateTool(server: McpServer, engine: PPEEngine): void {\n server.tool(\n 'simulate',\n 'Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.',\n {\n rules: z\n .array(z.record(z.unknown()))\n .describe('Array of Rule JSON objects (shared across all scenarios)'),\n scenarios: z.array(ScenarioSchema).min(1).describe('Array of scenarios to compare'),\n },\n async (args) => {\n try {\n const rules = hydrateRules(args.rules);\n\n const results = [];\n for (const scenario of args.scenarios) {\n const input = {\n data: scenario.input.data,\n requestId: scenario.input.requestId,\n meta: {\n ...scenario.input.meta,\n effectiveDate: scenario.input.meta.effectiveDate\n ? new Date(scenario.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n results.push({\n label: scenario.label,\n value: result.value,\n appliedCount: result.appliedRules.length,\n skippedCount: result.skippedRules.length,\n breakdown: result.breakdown.map((b) => ({\n ruleId: b.ruleId,\n contribution: b.contribution,\n modelUsed: b.modelUsed,\n })),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ results }, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\nfunction buildModelsCatalog(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`## ${model.name} (v${model.version})`);\n lines.push('');\n\n // Infer params from validation errors\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('### Parameters');\n lines.push('');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Model-specific documentation\n switch (model.name) {\n case 'FLAT_RATE':\n lines.push('Applies a flat rate to a base value: `base_value * rate`.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.18, \"base\": \"revenue\" }`');\n lines.push('**Use case**: TVA, flat tax rates.');\n break;\n case 'PROGRESSIVE_BRACKET':\n lines.push(\n 'Applies progressive tax brackets cumulatively. Each bracket taxes only the portion within its range.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"income\", \"brackets\": [{ \"from\": 0, \"to\": 500000, \"rate\": 0 }, { \"from\": 500000, \"to\": 1000000, \"rate\": 0.1 }] }`',\n );\n lines.push('**Use case**: IRPP (income tax), progressive taxes.');\n break;\n case 'MINIMUM_TAX':\n lines.push('Computes `MAX(base_value * rate, minimum)`. Ensures a minimum tax amount.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.01, \"base\": \"revenue\", \"minimum\": 50000 }`');\n lines.push('**Use case**: Minimum corporate tax.');\n break;\n case 'THRESHOLD_BASED':\n lines.push(\n 'Applies a rate only when the base value exceeds a threshold. If `above_only` is true, taxes only the amount above the threshold.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"revenue\", \"threshold\": 1000000, \"rate\": 0.05, \"above_only\": true }`',\n );\n lines.push('**Use case**: Luxury tax, excess profit tax.');\n break;\n case 'FIXED_AMOUNT':\n lines.push('Returns a fixed amount regardless of input values.');\n lines.push('');\n lines.push('**Example params**: `{ \"amount\": 25000, \"currency\": \"XOF\" }`');\n lines.push('**Use case**: Fixed registration fees, stamps.');\n break;\n case 'COMPOSITE':\n lines.push(\n 'Combines multiple sub-models using an aggregation function (SUM, MAX, or MIN).',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"steps\": [{ \"model\": \"FLAT_RATE\", \"params\": { \"rate\": 0.18, \"base\": \"revenue\" } }], \"aggregation\": \"SUM\" }`',\n );\n lines.push('**Use case**: Complex tax calculations combining multiple methods.');\n break;\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function registerModelsResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.resource(\n 'models-catalog',\n 'models://catalog',\n {\n description:\n 'Documentation of all available calculation models with parameter schemas and usage examples',\n },\n () => {\n const catalog = buildModelsCatalog(models);\n return {\n contents: [\n {\n uri: 'models://catalog',\n mimeType: 'text/markdown',\n text: catalog,\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEPlugin, DSLEvaluator } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nexport function registerPluginsResource(\n server: McpServer,\n plugins: readonly PPEPlugin[],\n dsls: readonly DSLEvaluator[],\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'plugins-loaded',\n 'plugins://loaded',\n { description: 'Information about loaded plugins, DSL evaluators, and their descriptors' },\n () => {\n const descriptors = registry.getAll();\n\n const info = {\n plugins: plugins.map((p) => {\n const desc = descriptors.find((d) => d.name === p.name);\n const pluginWithModels = p as { models?: { name: string }[] };\n return {\n name: p.name,\n version: p.version,\n models: Array.isArray(pluginWithModels.models)\n ? pluginWithModels.models.map((m) => m.name)\n : [],\n hasDescriptor: desc !== undefined,\n ruleExtensions: desc?.ruleExtensions.map((f) => f.name) ?? [],\n };\n }),\n dsls: dsls.map((d) => ({\n name: d.dsl,\n version: d.version,\n })),\n };\n\n return {\n contents: [\n {\n uri: 'plugins://loaded',\n mimeType: 'application/json',\n text: JSON.stringify(info, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildSchemaDocument(\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Rule Schema');\n lines.push('');\n lines.push('Complete schema for creating valid rules with the currently loaded plugins.');\n lines.push('');\n\n // Base Rule fields\n lines.push('## Base Rule Fields (always required)');\n lines.push('');\n lines.push('| Field | Type | Required | Description |');\n lines.push('|-------|------|----------|-------------|');\n lines.push('| id | string | yes | Unique rule identifier |');\n lines.push('| version | number | auto (=1) | Rule version |');\n lines.push('| model | string | yes | Calculation model name |');\n lines.push('| params | object | yes | Model-specific parameters |');\n lines.push(\n '| priority | number | optional | Auto-computed by plugins (e.g. jurisdiction+scope) |',\n );\n lines.push('| effectiveFrom | string | yes | ISO 8601 date |');\n lines.push('| effectiveUntil | string\\\\|null | optional | ISO 8601 date or null |');\n lines.push('| tags | string[] | optional | Filtering tags |');\n lines.push('| checksum | string | auto | SHA-256 of params (auto-computed by create_rule) |');\n lines.push('| condition | {dsl,value} | optional | DSL condition (e.g. jsonlogic) |');\n lines.push('');\n\n // Plugin extension fields\n const descriptors = registry.getAll();\n if (descriptors.length > 0) {\n lines.push('## Plugin Extension Fields');\n lines.push('');\n\n for (const desc of descriptors) {\n lines.push(`### ${desc.name} (v${desc.version})`);\n lines.push('');\n lines.push(desc.description);\n lines.push('');\n lines.push('| Field | Type | Required | Values | Description |');\n lines.push('|-------|------|----------|--------|-------------|');\n\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? field.enum.join(', ') : '-';\n lines.push(\n `| ${field.name} | ${field.type} | ${field.required ? 'yes' : 'no'} | ${values} | ${field.description} |`,\n );\n }\n lines.push('');\n }\n }\n\n // Available models + params\n lines.push('## Available Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`### ${model.name} (v${model.version})`);\n lines.push('');\n\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('**Required params:**');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n }\n lines.push('');\n }\n\n // Input data fields\n const inputFields = registry.getInputFields();\n if (inputFields.length > 0) {\n lines.push('## Input Data Fields (input.data)');\n lines.push('');\n lines.push('Variables available for use in JSONLogic conditions (`{\"var\": \"fieldName\"}`)');\n lines.push('and as `base` parameter in calculation models.');\n lines.push('');\n lines.push('| Field | Type | Description | Examples |');\n lines.push('|-------|------|-------------|----------|');\n\n for (const field of inputFields) {\n const examples = field.examples ? field.examples.join(', ') : '-';\n lines.push(`| ${field.name} | ${field.type} | ${field.description} | ${examples} |`);\n }\n lines.push('');\n }\n\n // JSONLogic DSL reference\n lines.push('## JSONLogic Condition Syntax');\n lines.push('');\n lines.push('Conditions use the `jsonlogic` DSL. Format:');\n lines.push('```json');\n lines.push('{ \"dsl\": \"jsonlogic\", \"value\": <expression> }');\n lines.push('```');\n lines.push('');\n lines.push('**Common operators:**');\n lines.push('- `{\">=\": [{\"var\": \"revenue\"}, 1000000]}` - comparison');\n lines.push('- `{\"and\": [expr1, expr2]}` - logical AND');\n lines.push('- `{\"or\": [expr1, expr2]}` - logical OR');\n lines.push('- `{\"!\": expr}` - logical NOT');\n lines.push('- `{\"in\": [\"value\", {\"var\": \"tags\"}]}` - membership');\n lines.push('- `{\"==\": [{\"var\": \"type\"}, \"enterprise\"]}` - equality');\n lines.push('');\n\n // Examples\n const examples = registry.getExamples();\n if (examples.length > 0) {\n lines.push('## Complete Rule Examples');\n lines.push('');\n\n for (const example of examples) {\n lines.push(`### ${example.title}`);\n lines.push('');\n lines.push(example.description);\n lines.push('');\n lines.push('**Rule:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.rule, null, 2));\n lines.push('```');\n\n if (example.input) {\n lines.push('');\n lines.push('**Input data:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.input, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerSchemaResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'rule-schema',\n 'schema://rules',\n {\n description:\n 'Complete rule schema including base fields, plugin extensions, model params, input variables, DSL syntax, and examples. THE reference for creating valid rules.',\n },\n () => ({\n contents: [\n {\n uri: 'schema://rules',\n mimeType: 'text/markdown',\n text: buildSchemaDocument(models, registry),\n },\n ],\n }),\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'policy';\n return descriptors.map((d) => d.domainLabel).join(' / ');\n}\n\nfunction buildModelDocs(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n for (const [, model] of models) {\n const validation = model.validateParams({});\n const paramHints = validation.errors ? validation.errors.join('; ') : 'none';\n lines.push(`- **${model.name}** (v${model.version}): ${paramHints}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildExtensionDocs(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return '';\n\n const lines: string[] = [];\n for (const desc of descriptors) {\n lines.push(`\\n### Plugin: ${desc.name}`);\n lines.push(desc.description);\n lines.push('\\n**Required fields on each rule:**');\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? ` (values: ${field.enum.join(', ')})` : '';\n const req = field.required ? ' [REQUIRED]' : ' [optional]';\n lines.push(`- \\`${field.name}\\`${req}: ${field.description}${values}`);\n }\n }\n return lines.join('\\n');\n}\n\nfunction buildExampleDocs(registry: DescriptorRegistry): string {\n const examples = registry.getExamples();\n if (examples.length === 0) return '';\n\n const lines: string[] = ['\\n## Concrete Examples'];\n for (const ex of examples) {\n lines.push(`\\n### ${ex.title}`);\n lines.push(ex.description);\n lines.push('```json');\n lines.push(JSON.stringify(ex.rule, null, 2));\n lines.push('```');\n }\n return lines.join('\\n');\n}\n\nfunction buildInputDocs(registry: DescriptorRegistry): string {\n const fields = registry.getInputFields();\n if (fields.length === 0) return '';\n\n const lines: string[] = ['\\n## Available input.data Fields'];\n lines.push('Use these as `{\"var\": \"fieldName\"}` in JSONLogic conditions');\n lines.push('and as `\"base\"` parameter in calculation models:\\n');\n for (const f of fields) {\n const examples = f.examples ? ` (e.g. ${f.examples.join(', ')})` : '';\n lines.push(`- \\`${f.name}\\` (${f.type}): ${f.description}${examples}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const lines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n lines.push(`\\n## ${desc.domainLabel} Guidelines`);\n for (const g of desc.promptGuidelines) {\n lines.push(`- ${g}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerAnalyzeTextPrompt(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n const domainLabel = buildDomainLabel(registry);\n\n server.prompt(\n 'analyze-text',\n `Translate a ${domainLabel} text (law, regulation, policy) into Run-IQ rule definitions. Plugin-aware: includes all required fields.`,\n {\n source_text: z\n .string()\n .describe('The regulatory, legal, or policy text to analyze and convert into rules'),\n country: z.string().optional().describe('ISO country code (e.g. TG, FR, US, IN)'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are an expert at translating regulatory and policy texts into structured Run-IQ rules.\n\n## Available Calculation Models\n${buildModelDocs(models)}\n${buildExtensionDocs(registry)}\n${buildInputDocs(registry)}\n${buildGuidelinesSection(registry)}\n\n## Rule Creation Workflow\n1. Read the source text carefully\n2. Identify each rule, rate, threshold, bracket, condition, or exemption\n3. Map each identified element to the appropriate calculation model\n4. Use the \\`create_rule\\` tool — it knows ALL required fields for loaded plugins\n5. Use the \\`validate_rules\\` tool to verify your rules are valid\n6. Read \\`schema://rules\\` for the complete field reference if needed\n\n## JSONLogic Conditions\n\\`\\`\\`json\n{ \"dsl\": \"jsonlogic\", \"value\": { \">=\": [{ \"var\": \"revenue\" }, 100000] } }\n\\`\\`\\`\n${buildExampleDocs(registry)}\n${args.country ? `\\n## Target Country: ${args.country}\\n` : ''}\n## Source Text to Analyze\n${args.source_text}`,\n },\n },\n ],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const allGuidelines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n allGuidelines.push(`### ${desc.name} (${desc.domainLabel})`);\n for (const g of desc.promptGuidelines) {\n allGuidelines.push(`- ${g}`);\n }\n }\n }\n\n if (allGuidelines.length === 0) return '';\n return `## Domain-Specific Guidelines\\n${allGuidelines.join('\\n')}`;\n}\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'general-purpose';\n return descriptors.map((d) => d.domainLabel).join(' + ');\n}\n\nexport function registerDomainExpertPrompt(server: McpServer, registry: DescriptorRegistry): void {\n const descriptors = registry.getAll();\n const domainLabel = buildDomainLabel(registry);\n const pluginList = descriptors.map((d) => `- ${d.name}: ${d.description}`).join('\\n');\n\n server.prompt(\n 'domain-expert',\n `${domainLabel} calculation expertise: scenario comparison, result explanation, recommendations`,\n {\n question: z.string().describe('The question or scenario to analyze'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are a ${domainLabel} expert assistant powered by the Run-IQ PPE (Parametric Policy Engine).\n\n## Loaded Plugins\n${pluginList || 'No plugins loaded.'}\n\n## Your Tools\n- **evaluate**: evaluate rules against input data (always dry-run)\n- **simulate**: compare N scenarios side-by-side\n- **validate_rules**: verify rule structure, checksum, and plugin-specific fields\n- **explain_result**: human-readable result explanation\n- **create_rule**: generate rules with ALL required plugin fields\n- **inspect_rule**: analyze a single rule in detail\n- **list_models**: show available calculation models\n- **create_checksum**: compute SHA-256 for params\n\n## Key Resources\n- \\`schema://rules\\` — THE complete rule schema reference\n- \\`models://catalog\\` — model documentation with examples\n- \\`plugins://loaded\\` — loaded plugins and their capabilities\n\n## General Guidelines\n1. Always read \\`schema://rules\\` before creating rules — it has ALL required fields\n2. When comparing scenarios, use the \\`simulate\\` tool with clear labels\n3. Always validate rules after creating them\n\n${buildGuidelinesSection(registry)}\n\n## Question\n${args.question}`,\n },\n },\n ],\n };\n },\n );\n}\n","{\n \"name\": \"@run-iq/mcp-server\",\n \"version\": \"0.1.7\",\n \"description\": \"MCP server exposing the PPE engine to LLMs via stdio\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"run-iq-mcp\": \"./dist/index.js\",\n \"mcp-server\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src/ tests/ && prettier --check src/ tests/\",\n \"lint:fix\": \"eslint src/ tests/ --fix && prettier --write src/ tests/\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.27.0\",\n \"@run-iq/core\": \"^0.2.0\",\n \"@run-iq/plugin-sdk\": \"^0.2.2\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.11.0\",\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\n \"@typescript-eslint/parser\": \"^7.0.0\",\n \"eslint\": \"^8.57.0\",\n \"prettier\": \"^3.2.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^3.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Run-IQ/mcp-server.git\"\n },\n \"homepage\": \"https://github.com/Run-IQ/mcp-server#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/Run-IQ/mcp-server/issues\"\n },\n \"author\": \"Abdou-Raouf ATARMLA\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20.0.0\"\n }\n}\n","import pkg from '../../package.json' with { type: 'json' };\nexport const VERSION = pkg.version;\n"],"mappings":"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","names":["bundles","descriptorRegistry","engine","models","require","bundles","server","createHash","z","descriptors","server","descriptors","createHash","createHash","z","z","server","models","descriptors","createHash","server","models","z","server","engine","createHash","z","server","models","descriptors","z","createHash","z","server","z","hydrateRules","server","engine","models","server","server","plugins","dsls","descriptors","models","descriptors","examples","server","z","descriptors","models","server","z","buildGuidelinesSection","descriptors","buildDomainLabel","server"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/engine.ts","../src/descriptors/registry.ts","../src/loader/plugin-loader.ts","../src/tools/create-checksum.ts","../src/tools/create-rule.ts","../src/tools/schema-builder.ts","../src/tools/validate.ts","../src/tools/list-models.ts","../src/tools/evaluate.ts","../src/tools/inspect-rule.ts","../src/tools/explain.ts","../src/tools/simulate.ts","../src/resources/models.ts","../src/resources/plugins.ts","../src/resources/schema.ts","../src/prompts/analyze-text.ts","../src/prompts/domain-expert.ts","../package.json","../src/utils/version.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createEngine } from './engine.js';\nimport { loadPluginsFromDir, loadNpmPlugins } from './loader/plugin-loader.js';\nimport { registerCreateChecksumTool } from './tools/create-checksum.js';\nimport { registerCreateRuleTool } from './tools/create-rule.js';\nimport { registerValidateRulesTool } from './tools/validate.js';\nimport { registerListModelsTool } from './tools/list-models.js';\nimport { registerEvaluateTool } from './tools/evaluate.js';\nimport { registerInspectRuleTool } from './tools/inspect-rule.js';\nimport { registerExplainResultTool } from './tools/explain.js';\nimport { registerSimulateTool } from './tools/simulate.js';\nimport { registerModelsResource } from './resources/models.js';\nimport { registerPluginsResource } from './resources/plugins.js';\nimport { registerSchemaResource } from './resources/schema.js';\nimport { registerAnalyzeTextPrompt } from './prompts/analyze-text.js';\nimport { registerDomainExpertPrompt } from './prompts/domain-expert.js';\nimport { VERSION } from './utils/version.js';\n\nasync function main() {\n try {\n let pluginsDir: string | undefined;\n let rulesPath: string | undefined;\n const npmPlugins: string[] = [];\n const argv = process.argv.slice(2);\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--plugins-dir' && argv[i + 1]) {\n pluginsDir = argv[i + 1];\n i++;\n } else if (argv[i] === '--plugin' && argv[i + 1]) {\n npmPlugins.push(argv[i + 1]!);\n i++;\n } else if (argv[i] === '--rules' && argv[i + 1]) {\n rulesPath = argv[i + 1];\n i++;\n }\n }\n\n // Load plugin bundles\n const bundles: PluginBundle[] = [];\n const initialRules: any[] = [];\n if (pluginsDir) {\n const dirBundles = await loadPluginsFromDir(pluginsDir);\n bundles.push(...dirBundles);\n }\n if (npmPlugins.length > 0) {\n const npmBundles = await loadNpmPlugins(npmPlugins);\n bundles.push(...npmBundles);\n }\n\n const { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);\n const descriptors = descriptorRegistry.getAll();\n\n // Pre-load rules if --rules is provided\n if (rulesPath) {\n try {\n const fullPath = path.resolve(process.cwd(), rulesPath);\n const rulesContent = await fs.readFile(fullPath, 'utf-8');\n const loadedRules = JSON.parse(rulesContent);\n if (Array.isArray(loadedRules)) {\n initialRules.push(...loadedRules);\n console.error(`[MCP] Pre-loaded ${initialRules.length} rules from: ${rulesPath}`);\n }\n } catch (err) {\n console.error(`[MCP] Failed to pre-load rules from \"${rulesPath}\":`, err instanceof Error ? err.message : err);\n }\n }\n\n const server = new McpServer(\n {\n name: '@run-iq/mcp-server',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n // Tools\n registerCreateChecksumTool(server);\n registerCreateRuleTool(server, descriptors);\n registerValidateRulesTool(server, models, descriptors, initialRules);\n registerListModelsTool(server, models);\n registerEvaluateTool(server, engine, initialRules);\n registerInspectRuleTool(server, models, descriptors, initialRules);\n registerExplainResultTool(server);\n registerSimulateTool(server, engine, initialRules);\n\n // Resources\n registerModelsResource(server, models);\n registerPluginsResource(server, plugins, dsls, descriptorRegistry);\n registerSchemaResource(server, models, descriptorRegistry);\n\n // Prompts\n registerAnalyzeTextPrompt(server, models, descriptorRegistry);\n registerDomainExpertPrompt(server, descriptorRegistry);\n\n // Start stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log successful boot to stderr\n console.error(`[MCP] Server v${VERSION} started successfully with ${bundles.length} plugins.`);\n \n } catch (error) {\n console.error('[MCP] Fatal error during startup:', error);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('[MCP] Unhandled promise rejection during startup:', err);\n process.exit(1);\n});\n","import { PPEEngine } from '@run-iq/core';\nimport type { PPEPlugin, DSLEvaluator, CalculationModel } from '@run-iq/core';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { DescriptorRegistry } from './descriptors/registry.js';\n\nexport interface EngineContext {\n readonly engine: PPEEngine;\n readonly models: ReadonlyMap<string, CalculationModel>;\n readonly descriptorRegistry: DescriptorRegistry;\n readonly plugins: readonly PPEPlugin[];\n readonly dsls: readonly DSLEvaluator[];\n}\n\nexport function createEngine(bundles?: readonly PluginBundle[]): EngineContext {\n const descriptorRegistry = new DescriptorRegistry();\n const allPlugins: PPEPlugin[] = [];\n const allDsls: DSLEvaluator[] = [];\n\n if (bundles && bundles.length > 0) {\n for (const bundle of bundles) {\n allPlugins.push(bundle.plugin);\n descriptorRegistry.register(bundle.descriptor);\n if (bundle.dsls) {\n allDsls.push(...bundle.dsls);\n }\n }\n }\n\n const engine = new PPEEngine({\n plugins: allPlugins,\n dsls: allDsls,\n dryRun: true,\n strict: false,\n onConflict: 'first',\n onChecksumMismatch: 'skip',\n });\n\n // Build model map from plugins that expose a models property (BasePlugin pattern)\n const models = new Map<string, CalculationModel>();\n for (const plugin of allPlugins) {\n const pluginWithModels = plugin as { models?: CalculationModel[] };\n if (Array.isArray(pluginWithModels.models)) {\n for (const model of pluginWithModels.models) {\n models.set(model.name, model);\n }\n }\n }\n\n return { engine, models, descriptorRegistry, plugins: allPlugins, dsls: allDsls };\n}\n","import type {\n PluginDescriptor,\n RuleFieldDescriptor,\n InputFieldDescriptor,\n RuleExample,\n} from '@run-iq/plugin-sdk';\n\nexport class DescriptorRegistry {\n private readonly descriptors: PluginDescriptor[] = [];\n\n register(descriptor: PluginDescriptor): void {\n this.descriptors.push(descriptor);\n }\n\n getAll(): readonly PluginDescriptor[] {\n return this.descriptors;\n }\n\n getRuleExtensions(): readonly RuleFieldDescriptor[] {\n return this.descriptors.flatMap((d) => d.ruleExtensions);\n }\n\n getInputFields(): readonly InputFieldDescriptor[] {\n const seen = new Set<string>();\n const fields: InputFieldDescriptor[] = [];\n for (const d of this.descriptors) {\n for (const f of d.inputFields) {\n if (!seen.has(f.name)) {\n seen.add(f.name);\n fields.push(f);\n }\n }\n }\n return fields;\n }\n\n getExamples(): readonly RuleExample[] {\n return this.descriptors.flatMap((d) => d.examples);\n }\n\n isEmpty(): boolean {\n return this.descriptors.length === 0;\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createRequire } from 'node:module';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\n\nconst require = createRequire(import.meta.url);\n\nexport async function loadPluginsFromDir(dir: string): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n const absoluteDir = resolve(dir);\n const entries = await readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n if (!entry.name.endsWith('.js') && !entry.name.endsWith('.mjs')) continue;\n\n const filePath = resolve(absoluteDir, entry.name);\n const mod: Record<string, unknown> = await import(filePath);\n\n const bundle = (mod['default'] ?? mod) as Record<string, unknown>;\n\n if (\n bundle['plugin'] &&\n typeof bundle['plugin'] === 'object' &&\n bundle['descriptor'] &&\n typeof bundle['descriptor'] === 'object'\n ) {\n bundles.push(bundle as unknown as PluginBundle);\n }\n }\n\n return bundles;\n}\n\nexport async function loadNpmPlugins(packageNames: string[]): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n\n for (const pkgName of packageNames) {\n try {\n let resolvedPath: string;\n \n // If it looks like a local path, resolve it relative to CWD\n if (pkgName.startsWith('.') || pkgName.startsWith('/') || pkgName.includes(':')) {\n resolvedPath = path.resolve(process.cwd(), pkgName);\n } else {\n // Otherwise treat as an NPM package name\n resolvedPath = require.resolve(pkgName, { paths: [process.cwd()] });\n }\n\n const mod = await import(pathToFileURL(resolvedPath).href);\n\n // Handle various export patterns (ESM default, CJS module.exports, or named 'bundle')\n const bundle = (mod['default'] ?? mod['bundle'] ?? mod) as Record<string, unknown>;\n\n if (bundle && typeof bundle === 'object' && bundle['plugin'] && bundle['descriptor']) {\n bundles.push(bundle as unknown as PluginBundle);\n } else {\n // eslint-disable-next-line no-console\n console.error(\n `[MCP] Invalid PluginBundle exported by \"${pkgName}\". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`,\n );\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[MCP] Failed to load plugin \"${pkgName}\":`, err instanceof Error ? err.message : err);\n }\n }\n\n return bundles;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport function registerCreateChecksumTool(server: McpServer): void {\n server.tool(\n 'create_checksum',\n 'Compute the SHA-256 checksum of a params object. Used to generate the checksum field for Run-IQ rules.',\n { params: z.record(z.unknown()).describe('The params object to hash') },\n (args) => {\n const checksum = createHash('sha256').update(JSON.stringify(args.params)).digest('hex');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ checksum }, null, 2) }],\n };\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildCreateRuleSchema } from './schema-builder.js';\n\nexport function registerCreateRuleTool(\n server: McpServer,\n descriptors: readonly PluginDescriptor[],\n): void {\n const schema = buildCreateRuleSchema(descriptors);\n\n // Collect plugin extension field names\n const extensionFields = descriptors.flatMap((d) => d.ruleExtensions.map((f) => f.name));\n\n server.tool(\n 'create_rule',\n 'Generate a valid Run-IQ Rule JSON object with auto-computed SHA-256 checksum. Includes plugin-specific fields based on loaded plugins.',\n schema,\n (args: Record<string, unknown>) => {\n const params = args['params'] as Record<string, unknown>;\n const checksum = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n\n const rule: Record<string, unknown> = {\n id: args['id'],\n version: 1,\n model: args['model'],\n params,\n priority: (args['priority'] as number | undefined) ?? 1000,\n effectiveFrom: args['effectiveFrom'],\n effectiveUntil: args['effectiveUntil'] ?? null,\n tags: (args['tags'] as string[] | undefined) ?? [],\n checksum,\n };\n\n if (args['condition']) {\n rule['condition'] = args['condition'];\n }\n\n // Add plugin extension fields\n for (const field of extensionFields) {\n if (args[field] !== undefined) {\n rule[field] = args[field];\n }\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ rule }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { RuleFieldDescriptor, PluginDescriptor } from '@run-iq/plugin-sdk';\n\nfunction buildFieldSchema(field: RuleFieldDescriptor): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n if (field.enum && field.enum.length > 0) {\n schema = z.enum(field.enum as [string, ...string[]]);\n } else {\n switch (field.type) {\n case 'string':\n schema = z.string();\n break;\n case 'number':\n schema = z.number();\n break;\n case 'boolean':\n schema = z.boolean();\n break;\n }\n }\n\n if (!field.required) {\n schema = schema.optional();\n }\n\n return schema.describe(field.description);\n}\n\nexport function buildCreateRuleSchema(\n descriptors: readonly PluginDescriptor[],\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {\n id: z.string().describe('Unique rule identifier'),\n model: z.string().describe('Calculation model name (e.g. FLAT_RATE, PROGRESSIVE_BRACKET)'),\n params: z.record(z.unknown()).describe('Model-specific parameters'),\n priority: z\n .number()\n .int()\n .optional()\n .describe('Rule priority (may be auto-computed by plugins, e.g. from jurisdiction+scope)'),\n effectiveFrom: z.string().describe('ISO 8601 date string for when the rule becomes active'),\n effectiveUntil: z\n .string()\n .nullable()\n .optional()\n .describe('ISO 8601 date string for when the rule expires (null = no expiry)'),\n tags: z.array(z.string()).optional().describe('Optional tags for filtering'),\n condition: z\n .object({\n dsl: z.string().describe('DSL identifier (e.g. \"jsonlogic\")'),\n value: z.unknown().describe('DSL-specific condition expression'),\n })\n .optional()\n .describe('Optional condition expression'),\n };\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n shape[field.name] = buildFieldSchema(field);\n }\n }\n\n return shape;\n}\n\nexport function buildValidateExtensionErrors(\n rule: Record<string, unknown>,\n descriptors: readonly PluginDescriptor[],\n): string[] {\n const errors: string[] = [];\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n const value = rule[field.name];\n\n if (field.required && (value === undefined || value === null)) {\n errors.push(`\"${field.name}\" is required by ${descriptor.name}: ${field.description}`);\n continue;\n }\n\n if (value === undefined || value === null) continue;\n\n if (field.enum && !field.enum.includes(String(value))) {\n errors.push(\n `\"${field.name}\" must be one of: ${field.enum.join(', ')} (got \"${String(value)}\")`,\n );\n }\n\n if (field.type === 'string' && typeof value !== 'string') {\n errors.push(`\"${field.name}\" must be a string`);\n }\n if (field.type === 'number' && typeof value !== 'number') {\n errors.push(`\"${field.name}\" must be a number`);\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors.push(`\"${field.name}\" must be a boolean`);\n }\n }\n }\n\n return errors;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nconst RuleSchema = z.object({\n id: z.string(),\n version: z.number(),\n model: z.string(),\n params: z.unknown(),\n priority: z.number().optional(),\n effectiveFrom: z.string(),\n effectiveUntil: z.string().nullable(),\n tags: z.array(z.string()),\n checksum: z.string(),\n condition: z.object({ dsl: z.string(), value: z.unknown() }).optional(),\n});\n\ninterface ValidationEntry {\n ruleId: string;\n valid: boolean;\n errors?: string[];\n}\n\nexport function registerValidateRulesTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n initialRules: any[] = [],\n): void {\n server.tool(\n 'validate_rules',\n 'Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.',\n {\n rules: z.array(z.record(z.unknown())).optional().describe('Array of Rule JSON objects to validate'),\n },\n (args) => {\n const entries: ValidationEntry[] = [];\n const rulesToValidate = [...initialRules, ...(args.rules || [])];\n\n for (const raw of rulesToValidate) {\n const parsed = RuleSchema.safeParse(raw);\n const ruleId = typeof raw['id'] === 'string' ? raw['id'] : 'unknown';\n\n if (!parsed.success) {\n entries.push({\n ruleId,\n valid: false,\n errors: parsed.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`),\n });\n continue;\n }\n\n const rule = parsed.data;\n const errors: string[] = [];\n\n // Checksum verification\n const computed = createHash('sha256').update(JSON.stringify(rule.params)).digest('hex');\n if (computed !== rule.checksum) {\n errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);\n }\n\n // Model existence\n const model = models.get(rule.model);\n if (!model) {\n errors.push(\n `Model \"${rule.model}\" not found. Available: ${[...models.keys()].join(', ')}`,\n );\n } else {\n // Param validation via model\n const validation = model.validateParams(rule.params);\n if (!validation.valid && validation.errors) {\n errors.push(...validation.errors);\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(raw, descriptors);\n errors.push(...extensionErrors);\n\n entries.push({\n ruleId: rule.id,\n valid: errors.length === 0,\n ...(errors.length > 0 ? { errors } : {}),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ entries }, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\ninterface ModelInfo {\n name: string;\n version: string;\n paramsSchema: Record<string, string>;\n}\n\nexport function registerListModelsTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.tool(\n 'list_models',\n 'List all available calculation models with their parameter schemas. Shows model name, version, and expected parameters.',\n {},\n () => {\n const result: ModelInfo[] = [];\n\n for (const [, model] of models) {\n // Infer param schema from validation errors with empty object\n const validation = model.validateParams({});\n const paramsSchema: Record<string, string> = {};\n\n if (validation.errors) {\n for (const error of validation.errors) {\n // Parse error messages like '\"rate\" must be a number' or '\"base\" must be a string'\n const match = error.match(/^\"(\\w+)\"\\s+must be (?:a |an )?(.+)$/);\n if (match?.[1] && match[2]) {\n paramsSchema[match[1]] = match[2];\n }\n }\n }\n\n result.push({\n name: model.name,\n version: model.version,\n paramsSchema,\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ models: result }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nexport function registerEvaluateTool(server: McpServer, engine: PPEEngine, initialRules: any[] = []): void {\n server.tool(\n 'evaluate',\n 'Evaluate Run-IQ rules against input data in dry-run mode. Returns the computed value, breakdown per rule, applied/skipped rules, and execution trace.',\n {\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects'),\n input: z\n .object({\n data: z.record(z.unknown()).describe('Input data for evaluation'),\n requestId: z.string().describe('Unique request identifier'),\n meta: z.object({\n tenantId: z.string().describe('Tenant identifier'),\n userId: z.string().optional().describe('User identifier'),\n tags: z.array(z.string()).optional().describe('Tags for rule filtering'),\n context: z.record(z.unknown()).optional().describe('Additional context'),\n effectiveDate: z\n .string()\n .optional()\n .describe('ISO 8601 date for effective date evaluation'),\n }),\n })\n .describe('Evaluation input'),\n },\n async (args) => {\n try {\n const rules = hydrateRules([...initialRules, ...(args.rules || [])]);\n\n const input = {\n data: args.input.data,\n requestId: args.input.requestId,\n meta: {\n ...args.input.meta,\n effectiveDate: args.input.meta.effectiveDate\n ? new Date(args.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n const serializable = {\n value: result.value,\n breakdown: result.breakdown,\n appliedRules: result.appliedRules.map((r) => ({\n id: r.id,\n model: r.model,\n priority: r.priority,\n })),\n skippedRules: result.skippedRules.map((s) => ({\n ruleId: s.rule.id,\n reason: s.reason,\n })),\n trace: {\n steps: result.trace.steps.map((s) => ({\n ruleId: s.ruleId,\n modelUsed: s.modelUsed,\n contribution: s.contribution,\n durationMs: s.durationMs,\n })),\n totalDurationMs: result.trace.totalDurationMs,\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(serializable, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nexport function registerInspectRuleTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n initialRules: any[] = [],\n): void {\n server.tool(\n 'inspect_rule',\n 'Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.',\n {\n rule: z.record(z.unknown()).optional().describe('A single Rule JSON object to inspect'),\n ruleId: z.string().optional().describe('ID of a pre-loaded rule to inspect'),\n },\n (args) => {\n let rule = args.rule;\n\n // If ruleId provided, find it in initialRules\n if (args.ruleId && !rule) {\n rule = initialRules.find((r) => r.id === args.ruleId);\n }\n\n if (!rule) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Rule not found. Provide either \"rule\" object or \"ruleId\" of a pre-loaded rule.' }) }],\n isError: true,\n };\n }\n\n const id = typeof rule['id'] === 'string' ? rule['id'] : 'unknown';\n const modelName = typeof rule['model'] === 'string' ? rule['model'] : '';\n const params = rule['params'];\n const checksum = typeof rule['checksum'] === 'string' ? rule['checksum'] : '';\n\n // Checksum match\n const computed = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n const checksumMatch = computed === checksum;\n\n // Model found\n const model = models.get(modelName);\n const modelFound = model !== undefined;\n\n // Param validation\n let paramErrors: string[] | undefined;\n if (model) {\n const validation = model.validateParams(params);\n if (!validation.valid && validation.errors) {\n paramErrors = [...validation.errors];\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(rule, descriptors);\n\n // Active date check\n const now = new Date();\n const effectiveFrom =\n typeof rule['effectiveFrom'] === 'string' ? new Date(rule['effectiveFrom']) : null;\n const effectiveUntil =\n typeof rule['effectiveUntil'] === 'string' ? new Date(rule['effectiveUntil']) : null;\n\n const isActive =\n effectiveFrom !== null &&\n effectiveFrom <= now &&\n (effectiveUntil === null || effectiveUntil > now);\n\n const effectivePeriod = {\n from: effectiveFrom?.toISOString() ?? null,\n until: effectiveUntil?.toISOString() ?? null,\n };\n\n const allErrors = [...(paramErrors ?? []), ...extensionErrors];\n const valid = checksumMatch && modelFound && allErrors.length === 0 && isActive;\n\n const result: Record<string, unknown> = {\n ruleId: id,\n valid,\n checksumMatch,\n modelFound,\n isActive,\n effectivePeriod,\n };\n\n if (paramErrors && paramErrors.length > 0) {\n result['paramErrors'] = paramErrors;\n }\n if (extensionErrors.length > 0) {\n result['extensionErrors'] = extensionErrors;\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst EvaluationResultSchema = {\n result: z\n .object({\n value: z.unknown(),\n breakdown: z.array(\n z.object({\n ruleId: z.string(),\n contribution: z.unknown(),\n modelUsed: z.string(),\n label: z.string().optional(),\n }),\n ),\n appliedRules: z.array(\n z.object({\n id: z.string(),\n model: z.string(),\n priority: z.number(),\n }),\n ),\n skippedRules: z.array(\n z.object({\n ruleId: z.string(),\n reason: z.string(),\n }),\n ),\n trace: z\n .object({\n totalDurationMs: z.number(),\n steps: z.array(z.record(z.unknown())).optional(),\n })\n .optional(),\n })\n .describe('An EvaluationResult (or simplified result from the evaluate tool)'),\n};\n\nexport function registerExplainResultTool(server: McpServer): void {\n server.tool(\n 'explain_result',\n 'Generate a human-readable explanation of an evaluation result. Summarizes the total value, applied rules with their contributions, skipped rules with reasons, and execution timing.',\n EvaluationResultSchema,\n (args) => {\n const { result } = args;\n const lines: string[] = [];\n\n lines.push(`## Evaluation Result Summary`);\n lines.push('');\n lines.push(`**Total Value**: ${String(result.value)}`);\n lines.push('');\n\n // Applied rules\n if (result.appliedRules.length > 0) {\n lines.push(`### Applied Rules (${result.appliedRules.length})`);\n lines.push('');\n\n for (const applied of result.appliedRules) {\n const breakdown = result.breakdown.find((b) => b.ruleId === applied.id);\n const contribution = breakdown ? String(breakdown.contribution) : 'N/A';\n const label = breakdown?.label ? ` (${breakdown.label})` : '';\n\n lines.push(\n `- **${applied.id}**${label}: model=${applied.model}, priority=${applied.priority}, contribution=${contribution}`,\n );\n }\n lines.push('');\n } else {\n lines.push('### No rules were applied.');\n lines.push('');\n }\n\n // Skipped rules\n if (result.skippedRules.length > 0) {\n lines.push(`### Skipped Rules (${result.skippedRules.length})`);\n lines.push('');\n\n for (const skipped of result.skippedRules) {\n lines.push(`- **${skipped.ruleId}**: ${skipped.reason}`);\n }\n lines.push('');\n }\n\n // Timing\n if (result.trace?.totalDurationMs !== undefined) {\n lines.push(`### Timing`);\n lines.push('');\n lines.push(`Total duration: ${result.trace.totalDurationMs}ms`);\n }\n\n const explanation = lines.join('\\n');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ explanation }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nconst ScenarioSchema = z.object({\n label: z.string().describe('Human-readable scenario label'),\n input: z.object({\n data: z.record(z.unknown()),\n requestId: z.string(),\n meta: z.object({\n tenantId: z.string(),\n userId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n context: z.record(z.unknown()).optional(),\n effectiveDate: z.string().optional(),\n }),\n }),\n});\n\nexport function registerSimulateTool(server: McpServer, engine: PPEEngine, initialRules: any[] = []): void {\n server.tool(\n 'simulate',\n 'Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.',\n {\n rules: z\n .array(z.record(z.unknown()))\n .describe('Array of Rule JSON objects (shared across all scenarios)'),\n scenarios: z.array(ScenarioSchema).min(1).describe('Array of scenarios to compare'),\n },\n async (args) => {\n try {\n const rules = hydrateRules([...initialRules, ...(args.rules || [])]);\n\n const results = [];\n for (const scenario of args.scenarios) {\n const input = {\n data: scenario.input.data,\n requestId: scenario.input.requestId,\n meta: {\n ...scenario.input.meta,\n effectiveDate: scenario.input.meta.effectiveDate\n ? new Date(scenario.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n results.push({\n label: scenario.label,\n value: result.value,\n appliedCount: result.appliedRules.length,\n skippedCount: result.skippedRules.length,\n breakdown: result.breakdown.map((b) => ({\n ruleId: b.ruleId,\n contribution: b.contribution,\n modelUsed: b.modelUsed,\n })),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ results }, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\nfunction buildModelsCatalog(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`## ${model.name} (v${model.version})`);\n lines.push('');\n\n // Infer params from validation errors\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('### Parameters');\n lines.push('');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Model-specific documentation\n switch (model.name) {\n case 'FLAT_RATE':\n lines.push('Applies a flat rate to a base value: `base_value * rate`.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.18, \"base\": \"revenue\" }`');\n lines.push('**Use case**: TVA, flat tax rates.');\n break;\n case 'PROGRESSIVE_BRACKET':\n lines.push(\n 'Applies progressive tax brackets cumulatively. Each bracket taxes only the portion within its range.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"income\", \"brackets\": [{ \"from\": 0, \"to\": 500000, \"rate\": 0 }, { \"from\": 500000, \"to\": 1000000, \"rate\": 0.1 }] }`',\n );\n lines.push('**Use case**: IRPP (income tax), progressive taxes.');\n break;\n case 'MINIMUM_TAX':\n lines.push('Computes `MAX(base_value * rate, minimum)`. Ensures a minimum tax amount.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.01, \"base\": \"revenue\", \"minimum\": 50000 }`');\n lines.push('**Use case**: Minimum corporate tax.');\n break;\n case 'THRESHOLD_BASED':\n lines.push(\n 'Applies a rate only when the base value exceeds a threshold. If `above_only` is true, taxes only the amount above the threshold.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"revenue\", \"threshold\": 1000000, \"rate\": 0.05, \"above_only\": true }`',\n );\n lines.push('**Use case**: Luxury tax, excess profit tax.');\n break;\n case 'FIXED_AMOUNT':\n lines.push('Returns a fixed amount regardless of input values.');\n lines.push('');\n lines.push('**Example params**: `{ \"amount\": 25000, \"currency\": \"XOF\" }`');\n lines.push('**Use case**: Fixed registration fees, stamps.');\n break;\n case 'COMPOSITE':\n lines.push(\n 'Combines multiple sub-models using an aggregation function (SUM, MAX, or MIN).',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"steps\": [{ \"model\": \"FLAT_RATE\", \"params\": { \"rate\": 0.18, \"base\": \"revenue\" } }], \"aggregation\": \"SUM\" }`',\n );\n lines.push('**Use case**: Complex tax calculations combining multiple methods.');\n break;\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function registerModelsResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.resource(\n 'models-catalog',\n 'models://catalog',\n {\n description:\n 'Documentation of all available calculation models with parameter schemas and usage examples',\n },\n () => {\n const catalog = buildModelsCatalog(models);\n return {\n contents: [\n {\n uri: 'models://catalog',\n mimeType: 'text/markdown',\n text: catalog,\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEPlugin, DSLEvaluator } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nexport function registerPluginsResource(\n server: McpServer,\n plugins: readonly PPEPlugin[],\n dsls: readonly DSLEvaluator[],\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'plugins-loaded',\n 'plugins://loaded',\n { description: 'Information about loaded plugins, DSL evaluators, and their descriptors' },\n () => {\n const descriptors = registry.getAll();\n\n const info = {\n plugins: plugins.map((p) => {\n const desc = descriptors.find((d) => d.name === p.name);\n const pluginWithModels = p as { models?: { name: string }[] };\n return {\n name: p.name,\n version: p.version,\n models: Array.isArray(pluginWithModels.models)\n ? pluginWithModels.models.map((m) => m.name)\n : [],\n hasDescriptor: desc !== undefined,\n ruleExtensions: desc?.ruleExtensions.map((f) => f.name) ?? [],\n };\n }),\n dsls: dsls.map((d) => ({\n name: d.dsl,\n version: d.version,\n })),\n };\n\n return {\n contents: [\n {\n uri: 'plugins://loaded',\n mimeType: 'application/json',\n text: JSON.stringify(info, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildSchemaDocument(\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Rule Schema');\n lines.push('');\n lines.push('Complete schema for creating valid rules with the currently loaded plugins.');\n lines.push('');\n\n // Base Rule fields\n lines.push('## Base Rule Fields (always required)');\n lines.push('');\n lines.push('| Field | Type | Required | Description |');\n lines.push('|-------|------|----------|-------------|');\n lines.push('| id | string | yes | Unique rule identifier |');\n lines.push('| version | number | auto (=1) | Rule version |');\n lines.push('| model | string | yes | Calculation model name |');\n lines.push('| params | object | yes | Model-specific parameters |');\n lines.push(\n '| priority | number | optional | Auto-computed by plugins (e.g. jurisdiction+scope) |',\n );\n lines.push('| effectiveFrom | string | yes | ISO 8601 date |');\n lines.push('| effectiveUntil | string\\\\|null | optional | ISO 8601 date or null |');\n lines.push('| tags | string[] | optional | Filtering tags |');\n lines.push('| checksum | string | auto | SHA-256 of params (auto-computed by create_rule) |');\n lines.push('| condition | {dsl,value} | optional | DSL condition (e.g. jsonlogic) |');\n lines.push('');\n\n // Plugin extension fields\n const descriptors = registry.getAll();\n if (descriptors.length > 0) {\n lines.push('## Plugin Extension Fields');\n lines.push('');\n\n for (const desc of descriptors) {\n lines.push(`### ${desc.name} (v${desc.version})`);\n lines.push('');\n lines.push(desc.description);\n lines.push('');\n lines.push('| Field | Type | Required | Values | Description |');\n lines.push('|-------|------|----------|--------|-------------|');\n\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? field.enum.join(', ') : '-';\n lines.push(\n `| ${field.name} | ${field.type} | ${field.required ? 'yes' : 'no'} | ${values} | ${field.description} |`,\n );\n }\n lines.push('');\n }\n }\n\n // Available models + params\n lines.push('## Available Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`### ${model.name} (v${model.version})`);\n lines.push('');\n\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('**Required params:**');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n }\n lines.push('');\n }\n\n // Input data fields\n const inputFields = registry.getInputFields();\n if (inputFields.length > 0) {\n lines.push('## Input Data Fields (input.data)');\n lines.push('');\n lines.push('Variables available for use in JSONLogic conditions (`{\"var\": \"fieldName\"}`)');\n lines.push('and as `base` parameter in calculation models.');\n lines.push('');\n lines.push('| Field | Type | Description | Examples |');\n lines.push('|-------|------|-------------|----------|');\n\n for (const field of inputFields) {\n const examples = field.examples ? field.examples.join(', ') : '-';\n lines.push(`| ${field.name} | ${field.type} | ${field.description} | ${examples} |`);\n }\n lines.push('');\n }\n\n // JSONLogic DSL reference\n lines.push('## JSONLogic Condition Syntax');\n lines.push('');\n lines.push('Conditions use the `jsonlogic` DSL. Format:');\n lines.push('```json');\n lines.push('{ \"dsl\": \"jsonlogic\", \"value\": <expression> }');\n lines.push('```');\n lines.push('');\n lines.push('**Common operators:**');\n lines.push('- `{\">=\": [{\"var\": \"revenue\"}, 1000000]}` - comparison');\n lines.push('- `{\"and\": [expr1, expr2]}` - logical AND');\n lines.push('- `{\"or\": [expr1, expr2]}` - logical OR');\n lines.push('- `{\"!\": expr}` - logical NOT');\n lines.push('- `{\"in\": [\"value\", {\"var\": \"tags\"}]}` - membership');\n lines.push('- `{\"==\": [{\"var\": \"type\"}, \"enterprise\"]}` - equality');\n lines.push('');\n\n // Examples\n const examples = registry.getExamples();\n if (examples.length > 0) {\n lines.push('## Complete Rule Examples');\n lines.push('');\n\n for (const example of examples) {\n lines.push(`### ${example.title}`);\n lines.push('');\n lines.push(example.description);\n lines.push('');\n lines.push('**Rule:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.rule, null, 2));\n lines.push('```');\n\n if (example.input) {\n lines.push('');\n lines.push('**Input data:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.input, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerSchemaResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'rule-schema',\n 'schema://rules',\n {\n description:\n 'Complete rule schema including base fields, plugin extensions, model params, input variables, DSL syntax, and examples. THE reference for creating valid rules.',\n },\n () => ({\n contents: [\n {\n uri: 'schema://rules',\n mimeType: 'text/markdown',\n text: buildSchemaDocument(models, registry),\n },\n ],\n }),\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'policy';\n return descriptors.map((d) => d.domainLabel).join(' / ');\n}\n\nfunction buildModelDocs(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n for (const [, model] of models) {\n const validation = model.validateParams({});\n const paramHints = validation.errors ? validation.errors.join('; ') : 'none';\n lines.push(`- **${model.name}** (v${model.version}): ${paramHints}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildExtensionDocs(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return '';\n\n const lines: string[] = [];\n for (const desc of descriptors) {\n lines.push(`\\n### Plugin: ${desc.name}`);\n lines.push(desc.description);\n lines.push('\\n**Required fields on each rule:**');\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? ` (values: ${field.enum.join(', ')})` : '';\n const req = field.required ? ' [REQUIRED]' : ' [optional]';\n lines.push(`- \\`${field.name}\\`${req}: ${field.description}${values}`);\n }\n }\n return lines.join('\\n');\n}\n\nfunction buildExampleDocs(registry: DescriptorRegistry): string {\n const examples = registry.getExamples();\n if (examples.length === 0) return '';\n\n const lines: string[] = ['\\n## Concrete Examples'];\n for (const ex of examples) {\n lines.push(`\\n### ${ex.title}`);\n lines.push(ex.description);\n lines.push('```json');\n lines.push(JSON.stringify(ex.rule, null, 2));\n lines.push('```');\n }\n return lines.join('\\n');\n}\n\nfunction buildInputDocs(registry: DescriptorRegistry): string {\n const fields = registry.getInputFields();\n if (fields.length === 0) return '';\n\n const lines: string[] = ['\\n## Available input.data Fields'];\n lines.push('Use these as `{\"var\": \"fieldName\"}` in JSONLogic conditions');\n lines.push('and as `\"base\"` parameter in calculation models:\\n');\n for (const f of fields) {\n const examples = f.examples ? ` (e.g. ${f.examples.join(', ')})` : '';\n lines.push(`- \\`${f.name}\\` (${f.type}): ${f.description}${examples}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const lines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n lines.push(`\\n## ${desc.domainLabel} Guidelines`);\n for (const g of desc.promptGuidelines) {\n lines.push(`- ${g}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerAnalyzeTextPrompt(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n const domainLabel = buildDomainLabel(registry);\n\n server.prompt(\n 'analyze-text',\n `Translate a ${domainLabel} text (law, regulation, policy) into Run-IQ rule definitions. Plugin-aware: includes all required fields.`,\n {\n source_text: z\n .string()\n .describe('The regulatory, legal, or policy text to analyze and convert into rules'),\n country: z.string().optional().describe('ISO country code (e.g. TG, FR, US, IN)'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are an expert at translating regulatory and policy texts into structured Run-IQ rules.\n\n## Available Calculation Models\n${buildModelDocs(models)}\n${buildExtensionDocs(registry)}\n${buildInputDocs(registry)}\n${buildGuidelinesSection(registry)}\n\n## Rule Creation Workflow\n1. Read the source text carefully\n2. Identify each rule, rate, threshold, bracket, condition, or exemption\n3. Map each identified element to the appropriate calculation model\n4. Use the \\`create_rule\\` tool — it knows ALL required fields for loaded plugins\n5. Use the \\`validate_rules\\` tool to verify your rules are valid\n6. Read \\`schema://rules\\` for the complete field reference if needed\n\n## JSONLogic Conditions\n\\`\\`\\`json\n{ \"dsl\": \"jsonlogic\", \"value\": { \">=\": [{ \"var\": \"revenue\" }, 100000] } }\n\\`\\`\\`\n${buildExampleDocs(registry)}\n${args.country ? `\\n## Target Country: ${args.country}\\n` : ''}\n## Source Text to Analyze\n${args.source_text}`,\n },\n },\n ],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const allGuidelines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n allGuidelines.push(`### ${desc.name} (${desc.domainLabel})`);\n for (const g of desc.promptGuidelines) {\n allGuidelines.push(`- ${g}`);\n }\n }\n }\n\n if (allGuidelines.length === 0) return '';\n return `## Domain-Specific Guidelines\\n${allGuidelines.join('\\n')}`;\n}\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'general-purpose';\n return descriptors.map((d) => d.domainLabel).join(' + ');\n}\n\nexport function registerDomainExpertPrompt(server: McpServer, registry: DescriptorRegistry): void {\n const descriptors = registry.getAll();\n const domainLabel = buildDomainLabel(registry);\n const pluginList = descriptors.map((d) => `- ${d.name}: ${d.description}`).join('\\n');\n\n server.prompt(\n 'domain-expert',\n `${domainLabel} calculation expertise: scenario comparison, result explanation, recommendations`,\n {\n question: z.string().describe('The question or scenario to analyze'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are a ${domainLabel} expert assistant powered by the Run-IQ PPE (Parametric Policy Engine).\n\n## Loaded Plugins\n${pluginList || 'No plugins loaded.'}\n\n## Your Tools\n- **evaluate**: evaluate rules against input data (always dry-run)\n- **simulate**: compare N scenarios side-by-side\n- **validate_rules**: verify rule structure, checksum, and plugin-specific fields\n- **explain_result**: human-readable result explanation\n- **create_rule**: generate rules with ALL required plugin fields\n- **inspect_rule**: analyze a single rule in detail\n- **list_models**: show available calculation models\n- **create_checksum**: compute SHA-256 for params\n\n## Key Resources\n- \\`schema://rules\\` — THE complete rule schema reference\n- \\`models://catalog\\` — model documentation with examples\n- \\`plugins://loaded\\` — loaded plugins and their capabilities\n\n## General Guidelines\n1. Always read \\`schema://rules\\` before creating rules — it has ALL required fields\n2. When comparing scenarios, use the \\`simulate\\` tool with clear labels\n3. Always validate rules after creating them\n\n${buildGuidelinesSection(registry)}\n\n## Question\n${args.question}`,\n },\n },\n ],\n };\n },\n );\n}\n","{\n \"name\": \"@run-iq/mcp-server\",\n \"version\": \"0.1.9\",\n \"description\": \"MCP server exposing the PPE engine to LLMs via stdio\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"run-iq-mcp\": \"./dist/index.js\",\n \"mcp-server\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src/ tests/ && prettier --check src/ tests/\",\n \"lint:fix\": \"eslint src/ tests/ --fix && prettier --write src/ tests/\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.27.0\",\n \"@run-iq/core\": \"^0.2.0\",\n \"@run-iq/plugin-sdk\": \"^0.2.2\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.11.0\",\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\n \"@typescript-eslint/parser\": \"^7.0.0\",\n \"eslint\": \"^8.57.0\",\n \"prettier\": \"^3.2.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^3.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Run-IQ/mcp-server.git\"\n },\n \"homepage\": \"https://github.com/Run-IQ/mcp-server#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/Run-IQ/mcp-server/issues\"\n },\n \"author\": \"Abdou-Raouf ATARMLA\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20.0.0\"\n }\n}\n","import pkg from '../../package.json' with { type: 'json' };\nexport const VERSION = pkg.version;\n"],"mappings":"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","names":["path","require","createHash","z","createHash","createHash","z","z","createHash","z","createHash","z","z","createHash","z","z","hydrateRules","examples","z","z","buildGuidelinesSection","buildDomainLabel","path"]}
|
package/package.json
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@run-iq/mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "MCP server exposing the PPE engine to LLMs via stdio",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
|
-
"bin": {
|
|
9
|
-
"run-iq-mcp": "./dist/index.js",
|
|
10
|
-
"mcp-server": "./dist/index.js"
|
|
11
|
-
},
|
|
12
|
-
"exports": {
|
|
13
|
-
".": {
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"default": "./dist/index.js"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"files": [
|
|
19
|
-
"dist"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"build": "tsup",
|
|
23
|
-
"test": "vitest run",
|
|
24
|
-
"typecheck": "tsc --noEmit",
|
|
25
|
-
"lint": "eslint src/ tests/ && prettier --check src/ tests/",
|
|
26
|
-
"lint:fix": "eslint src/ tests/ --fix && prettier --write src/ tests/"
|
|
27
|
-
},
|
|
28
|
-
"dependencies": {
|
|
29
|
-
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
30
|
-
"@run-iq/core": "^0.2.0",
|
|
31
|
-
"@run-iq/plugin-sdk": "^0.2.2",
|
|
32
|
-
"zod": "^3.23.0"
|
|
33
|
-
},
|
|
34
|
-
"devDependencies": {
|
|
35
|
-
"@types/node": "^20.11.0",
|
|
36
|
-
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
37
|
-
"@typescript-eslint/parser": "^7.0.0",
|
|
38
|
-
"eslint": "^8.57.0",
|
|
39
|
-
"prettier": "^3.2.0",
|
|
40
|
-
"tsup": "^8.0.0",
|
|
41
|
-
"typescript": "^5.7.0",
|
|
42
|
-
"vitest": "^3.0.0"
|
|
43
|
-
},
|
|
44
|
-
"repository": {
|
|
45
|
-
"type": "git",
|
|
46
|
-
"url": "https://github.com/Run-IQ/mcp-server.git"
|
|
47
|
-
},
|
|
48
|
-
"homepage": "https://github.com/Run-IQ/mcp-server#readme",
|
|
49
|
-
"bugs": {
|
|
50
|
-
"url": "https://github.com/Run-IQ/mcp-server/issues"
|
|
51
|
-
},
|
|
52
|
-
"author": "Abdou-Raouf ATARMLA",
|
|
53
|
-
"license": "MIT",
|
|
54
|
-
"engines": {
|
|
55
|
-
"node": ">=20.0.0"
|
|
56
|
-
}
|
|
57
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@run-iq/mcp-server",
|
|
3
|
+
"version": "0.1.9",
|
|
4
|
+
"description": "MCP server exposing the PPE engine to LLMs via stdio",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"run-iq-mcp": "./dist/index.js",
|
|
10
|
+
"mcp-server": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"typecheck": "tsc --noEmit",
|
|
25
|
+
"lint": "eslint src/ tests/ && prettier --check src/ tests/",
|
|
26
|
+
"lint:fix": "eslint src/ tests/ --fix && prettier --write src/ tests/"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
30
|
+
"@run-iq/core": "^0.2.0",
|
|
31
|
+
"@run-iq/plugin-sdk": "^0.2.2",
|
|
32
|
+
"zod": "^3.23.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^20.11.0",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^7.0.0",
|
|
37
|
+
"@typescript-eslint/parser": "^7.0.0",
|
|
38
|
+
"eslint": "^8.57.0",
|
|
39
|
+
"prettier": "^3.2.0",
|
|
40
|
+
"tsup": "^8.0.0",
|
|
41
|
+
"typescript": "^5.7.0",
|
|
42
|
+
"vitest": "^3.0.0"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/Run-IQ/mcp-server.git"
|
|
47
|
+
},
|
|
48
|
+
"homepage": "https://github.com/Run-IQ/mcp-server#readme",
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/Run-IQ/mcp-server/issues"
|
|
51
|
+
},
|
|
52
|
+
"author": "Abdou-Raouf ATARMLA",
|
|
53
|
+
"license": "MIT",
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">=20.0.0"
|
|
56
|
+
}
|
|
57
|
+
}
|