@run-iq/mcp-server 0.1.8 → 0.1.10
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 +193 -163
- package/dist/index.js.map +1 -1
- package/package.json +57 -57
package/dist/index.js
CHANGED
|
@@ -41,20 +41,20 @@ var DescriptorRegistry = class {
|
|
|
41
41
|
};
|
|
42
42
|
|
|
43
43
|
// src/engine.ts
|
|
44
|
-
function createEngine(
|
|
45
|
-
const
|
|
44
|
+
function createEngine(bundles2) {
|
|
45
|
+
const descriptorRegistry2 = new DescriptorRegistry();
|
|
46
46
|
const allPlugins = [];
|
|
47
47
|
const allDsls = [];
|
|
48
|
-
if (
|
|
49
|
-
for (const bundle of
|
|
48
|
+
if (bundles2 && bundles2.length > 0) {
|
|
49
|
+
for (const bundle of bundles2) {
|
|
50
50
|
allPlugins.push(bundle.plugin);
|
|
51
|
-
|
|
51
|
+
descriptorRegistry2.register(bundle.descriptor);
|
|
52
52
|
if (bundle.dsls) {
|
|
53
53
|
allDsls.push(...bundle.dsls);
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
const
|
|
57
|
+
const engine2 = new PPEEngine({
|
|
58
58
|
plugins: allPlugins,
|
|
59
59
|
dsls: allDsls,
|
|
60
60
|
dryRun: true,
|
|
@@ -62,66 +62,108 @@ function createEngine(bundles) {
|
|
|
62
62
|
onConflict: "first",
|
|
63
63
|
onChecksumMismatch: "skip"
|
|
64
64
|
});
|
|
65
|
-
const
|
|
65
|
+
const models2 = /* @__PURE__ */ new Map();
|
|
66
66
|
for (const plugin of allPlugins) {
|
|
67
67
|
const pluginWithModels = plugin;
|
|
68
68
|
if (Array.isArray(pluginWithModels.models)) {
|
|
69
69
|
for (const model of pluginWithModels.models) {
|
|
70
|
-
|
|
70
|
+
models2.set(model.name, model);
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
return { engine, models, descriptorRegistry, plugins: allPlugins, dsls: allDsls };
|
|
74
|
+
return { engine: engine2, models: models2, descriptorRegistry: descriptorRegistry2, plugins: allPlugins, dsls: allDsls };
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
// src/loader/plugin-loader.ts
|
|
78
|
+
import { execSync } from "child_process";
|
|
79
|
+
import { existsSync, mkdirSync, writeFileSync } from "fs";
|
|
78
80
|
import { readdir } from "fs/promises";
|
|
79
|
-
import { resolve } from "path";
|
|
81
|
+
import { resolve, join } from "path";
|
|
80
82
|
import { pathToFileURL } from "url";
|
|
81
83
|
import { createRequire } from "module";
|
|
84
|
+
import { homedir } from "os";
|
|
82
85
|
var require2 = createRequire(import.meta.url);
|
|
86
|
+
var AUTO_PLUGINS_DIR = resolve(homedir(), ".run-iq", "mcp-plugins");
|
|
83
87
|
async function loadPluginsFromDir(dir) {
|
|
84
|
-
const
|
|
88
|
+
const bundles2 = [];
|
|
85
89
|
const absoluteDir = resolve(dir);
|
|
90
|
+
if (!existsSync(absoluteDir)) return [];
|
|
86
91
|
const entries = await readdir(absoluteDir, { withFileTypes: true });
|
|
87
92
|
for (const entry of entries) {
|
|
88
|
-
if (!entry.isFile()) continue;
|
|
89
|
-
if (!entry.name.endsWith(".js") && !entry.name.endsWith(".mjs")) continue;
|
|
93
|
+
if (!entry.isFile() || !/\.(mjs|js)$/.test(entry.name)) continue;
|
|
90
94
|
const filePath = resolve(absoluteDir, entry.name);
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
if (bundle["plugin"] && typeof bundle["plugin"] === "object" && bundle["descriptor"] && typeof bundle["descriptor"] === "object") {
|
|
94
|
-
bundles.push(bundle);
|
|
95
|
-
}
|
|
95
|
+
const bundle = await importBundle(pathToFileURL(filePath).href);
|
|
96
|
+
if (bundle) bundles2.push(bundle);
|
|
96
97
|
}
|
|
97
|
-
return
|
|
98
|
+
return bundles2;
|
|
98
99
|
}
|
|
99
100
|
async function loadNpmPlugins(packageNames) {
|
|
100
|
-
const
|
|
101
|
+
const bundles2 = [];
|
|
101
102
|
for (const pkgName of packageNames) {
|
|
102
103
|
try {
|
|
103
|
-
const resolvedPath =
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
bundles.push(bundle);
|
|
104
|
+
const resolvedPath = await resolveOrInstallPlugin(pkgName);
|
|
105
|
+
const bundle = await importBundle(pathToFileURL(resolvedPath).href);
|
|
106
|
+
if (bundle) {
|
|
107
|
+
bundles2.push(bundle);
|
|
108
108
|
} else {
|
|
109
|
-
console.error(
|
|
110
|
-
`[MCP] Invalid PluginBundle exported by NPM package "${pkgName}". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`
|
|
111
|
-
);
|
|
109
|
+
console.error(`[PluginLoader] Invalid PluginBundle in package: ${pkgName}`);
|
|
112
110
|
}
|
|
113
111
|
} catch (err) {
|
|
114
|
-
console.error(`[
|
|
112
|
+
console.error(`[PluginLoader] Failed to load NPM plugin "${pkgName}":`, err instanceof Error ? err.message : err);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return bundles2;
|
|
116
|
+
}
|
|
117
|
+
async function resolveOrInstallPlugin(pkgName) {
|
|
118
|
+
try {
|
|
119
|
+
return require2.resolve(pkgName, { paths: [process.cwd()] });
|
|
120
|
+
} catch {
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return require2.resolve(pkgName, { paths: [AUTO_PLUGINS_DIR] });
|
|
124
|
+
} catch {
|
|
125
|
+
}
|
|
126
|
+
ensurePluginsDir();
|
|
127
|
+
console.log(`[PluginLoader] Installing ${pkgName} dynamically...`);
|
|
128
|
+
execSync(`npm install ${pkgName} --no-save`, {
|
|
129
|
+
cwd: AUTO_PLUGINS_DIR,
|
|
130
|
+
stdio: "inherit"
|
|
131
|
+
});
|
|
132
|
+
return require2.resolve(pkgName, { paths: [AUTO_PLUGINS_DIR] });
|
|
133
|
+
}
|
|
134
|
+
function ensurePluginsDir() {
|
|
135
|
+
if (!existsSync(AUTO_PLUGINS_DIR)) {
|
|
136
|
+
mkdirSync(AUTO_PLUGINS_DIR, { recursive: true });
|
|
137
|
+
writeFileSync(
|
|
138
|
+
join(AUTO_PLUGINS_DIR, "package.json"),
|
|
139
|
+
JSON.stringify({ name: "mcp-plugins", private: true, version: "1.0.0" }, null, 2)
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async function importBundle(url) {
|
|
144
|
+
try {
|
|
145
|
+
const mod = await import(url);
|
|
146
|
+
let bundle = mod.default ?? mod;
|
|
147
|
+
if (!bundle.plugin && bundle.bundle?.plugin) {
|
|
148
|
+
bundle = bundle.bundle;
|
|
149
|
+
}
|
|
150
|
+
if (isValidBundle(bundle)) {
|
|
151
|
+
return bundle;
|
|
115
152
|
}
|
|
153
|
+
} catch (err) {
|
|
154
|
+
console.error(`[PluginLoader] Import error for ${url}:`, err);
|
|
116
155
|
}
|
|
117
|
-
return
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
function isValidBundle(obj) {
|
|
159
|
+
return obj && typeof obj === "object" && typeof obj.plugin === "object" && typeof obj.descriptor === "object";
|
|
118
160
|
}
|
|
119
161
|
|
|
120
162
|
// src/tools/create-checksum.ts
|
|
121
163
|
import { createHash } from "crypto";
|
|
122
164
|
import { z } from "zod";
|
|
123
|
-
function registerCreateChecksumTool(
|
|
124
|
-
|
|
165
|
+
function registerCreateChecksumTool(server2) {
|
|
166
|
+
server2.tool(
|
|
125
167
|
"create_checksum",
|
|
126
168
|
"Compute the SHA-256 checksum of a params object. Used to generate the checksum field for Run-IQ rules.",
|
|
127
169
|
{ params: z.record(z.unknown()).describe("The params object to hash") },
|
|
@@ -161,7 +203,7 @@ function buildFieldSchema(field) {
|
|
|
161
203
|
}
|
|
162
204
|
return schema.describe(field.description);
|
|
163
205
|
}
|
|
164
|
-
function buildCreateRuleSchema(
|
|
206
|
+
function buildCreateRuleSchema(descriptors2) {
|
|
165
207
|
const shape = {
|
|
166
208
|
id: z2.string().describe("Unique rule identifier"),
|
|
167
209
|
model: z2.string().describe("Calculation model name (e.g. FLAT_RATE, PROGRESSIVE_BRACKET)"),
|
|
@@ -175,16 +217,16 @@ function buildCreateRuleSchema(descriptors) {
|
|
|
175
217
|
value: z2.unknown().describe("DSL-specific condition expression")
|
|
176
218
|
}).optional().describe("Optional condition expression")
|
|
177
219
|
};
|
|
178
|
-
for (const descriptor of
|
|
220
|
+
for (const descriptor of descriptors2) {
|
|
179
221
|
for (const field of descriptor.ruleExtensions) {
|
|
180
222
|
shape[field.name] = buildFieldSchema(field);
|
|
181
223
|
}
|
|
182
224
|
}
|
|
183
225
|
return shape;
|
|
184
226
|
}
|
|
185
|
-
function buildValidateExtensionErrors(rule,
|
|
227
|
+
function buildValidateExtensionErrors(rule, descriptors2) {
|
|
186
228
|
const errors = [];
|
|
187
|
-
for (const descriptor of
|
|
229
|
+
for (const descriptor of descriptors2) {
|
|
188
230
|
for (const field of descriptor.ruleExtensions) {
|
|
189
231
|
const value = rule[field.name];
|
|
190
232
|
if (field.required && (value === void 0 || value === null)) {
|
|
@@ -212,10 +254,10 @@ function buildValidateExtensionErrors(rule, descriptors) {
|
|
|
212
254
|
}
|
|
213
255
|
|
|
214
256
|
// src/tools/create-rule.ts
|
|
215
|
-
function registerCreateRuleTool(
|
|
216
|
-
const schema = buildCreateRuleSchema(
|
|
217
|
-
const extensionFields =
|
|
218
|
-
|
|
257
|
+
function registerCreateRuleTool(server2, descriptors2) {
|
|
258
|
+
const schema = buildCreateRuleSchema(descriptors2);
|
|
259
|
+
const extensionFields = descriptors2.flatMap((d) => d.ruleExtensions.map((f) => f.name));
|
|
260
|
+
server2.tool(
|
|
219
261
|
"create_rule",
|
|
220
262
|
"Generate a valid Run-IQ Rule JSON object with auto-computed SHA-256 checksum. Includes plugin-specific fields based on loaded plugins.",
|
|
221
263
|
schema,
|
|
@@ -263,8 +305,8 @@ var RuleSchema = z3.object({
|
|
|
263
305
|
checksum: z3.string(),
|
|
264
306
|
condition: z3.object({ dsl: z3.string(), value: z3.unknown() }).optional()
|
|
265
307
|
});
|
|
266
|
-
function registerValidateRulesTool(
|
|
267
|
-
|
|
308
|
+
function registerValidateRulesTool(server2, models2, descriptors2) {
|
|
309
|
+
server2.tool(
|
|
268
310
|
"validate_rules",
|
|
269
311
|
"Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.",
|
|
270
312
|
{
|
|
@@ -289,10 +331,10 @@ function registerValidateRulesTool(server, models, descriptors) {
|
|
|
289
331
|
if (computed !== rule.checksum) {
|
|
290
332
|
errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);
|
|
291
333
|
}
|
|
292
|
-
const model =
|
|
334
|
+
const model = models2.get(rule.model);
|
|
293
335
|
if (!model) {
|
|
294
336
|
errors.push(
|
|
295
|
-
`Model "${rule.model}" not found. Available: ${[...
|
|
337
|
+
`Model "${rule.model}" not found. Available: ${[...models2.keys()].join(", ")}`
|
|
296
338
|
);
|
|
297
339
|
} else {
|
|
298
340
|
const validation = model.validateParams(rule.params);
|
|
@@ -300,7 +342,7 @@ function registerValidateRulesTool(server, models, descriptors) {
|
|
|
300
342
|
errors.push(...validation.errors);
|
|
301
343
|
}
|
|
302
344
|
}
|
|
303
|
-
const extensionErrors = buildValidateExtensionErrors(raw,
|
|
345
|
+
const extensionErrors = buildValidateExtensionErrors(raw, descriptors2);
|
|
304
346
|
errors.push(...extensionErrors);
|
|
305
347
|
entries.push({
|
|
306
348
|
ruleId: rule.id,
|
|
@@ -316,14 +358,14 @@ function registerValidateRulesTool(server, models, descriptors) {
|
|
|
316
358
|
}
|
|
317
359
|
|
|
318
360
|
// src/tools/list-models.ts
|
|
319
|
-
function registerListModelsTool(
|
|
320
|
-
|
|
361
|
+
function registerListModelsTool(server2, models2) {
|
|
362
|
+
server2.tool(
|
|
321
363
|
"list_models",
|
|
322
364
|
"List all available calculation models with their parameter schemas. Shows model name, version, and expected parameters.",
|
|
323
365
|
{},
|
|
324
366
|
() => {
|
|
325
367
|
const result = [];
|
|
326
|
-
for (const [, model] of
|
|
368
|
+
for (const [, model] of models2) {
|
|
327
369
|
const validation = model.validateParams({});
|
|
328
370
|
const paramsSchema = {};
|
|
329
371
|
if (validation.errors) {
|
|
@@ -350,8 +392,8 @@ function registerListModelsTool(server, models) {
|
|
|
350
392
|
// src/tools/evaluate.ts
|
|
351
393
|
import { z as z4 } from "zod";
|
|
352
394
|
import { hydrateRules } from "@run-iq/core";
|
|
353
|
-
function registerEvaluateTool(
|
|
354
|
-
|
|
395
|
+
function registerEvaluateTool(server2, engine2) {
|
|
396
|
+
server2.tool(
|
|
355
397
|
"evaluate",
|
|
356
398
|
"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
399
|
{
|
|
@@ -379,7 +421,7 @@ function registerEvaluateTool(server, engine) {
|
|
|
379
421
|
effectiveDate: args.input.meta.effectiveDate ? new Date(args.input.meta.effectiveDate) : void 0
|
|
380
422
|
}
|
|
381
423
|
};
|
|
382
|
-
const result = await
|
|
424
|
+
const result = await engine2.evaluate(rules, input);
|
|
383
425
|
const serializable = {
|
|
384
426
|
value: result.value,
|
|
385
427
|
breakdown: result.breakdown,
|
|
@@ -419,8 +461,8 @@ function registerEvaluateTool(server, engine) {
|
|
|
419
461
|
// src/tools/inspect-rule.ts
|
|
420
462
|
import { createHash as createHash4 } from "crypto";
|
|
421
463
|
import { z as z5 } from "zod";
|
|
422
|
-
function registerInspectRuleTool(
|
|
423
|
-
|
|
464
|
+
function registerInspectRuleTool(server2, models2, descriptors2) {
|
|
465
|
+
server2.tool(
|
|
424
466
|
"inspect_rule",
|
|
425
467
|
"Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.",
|
|
426
468
|
{
|
|
@@ -434,7 +476,7 @@ function registerInspectRuleTool(server, models, descriptors) {
|
|
|
434
476
|
const checksum = typeof rule["checksum"] === "string" ? rule["checksum"] : "";
|
|
435
477
|
const computed = createHash4("sha256").update(JSON.stringify(params)).digest("hex");
|
|
436
478
|
const checksumMatch = computed === checksum;
|
|
437
|
-
const model =
|
|
479
|
+
const model = models2.get(modelName);
|
|
438
480
|
const modelFound = model !== void 0;
|
|
439
481
|
let paramErrors;
|
|
440
482
|
if (model) {
|
|
@@ -443,7 +485,7 @@ function registerInspectRuleTool(server, models, descriptors) {
|
|
|
443
485
|
paramErrors = [...validation.errors];
|
|
444
486
|
}
|
|
445
487
|
}
|
|
446
|
-
const extensionErrors = buildValidateExtensionErrors(rule,
|
|
488
|
+
const extensionErrors = buildValidateExtensionErrors(rule, descriptors2);
|
|
447
489
|
const now = /* @__PURE__ */ new Date();
|
|
448
490
|
const effectiveFrom = typeof rule["effectiveFrom"] === "string" ? new Date(rule["effectiveFrom"]) : null;
|
|
449
491
|
const effectiveUntil = typeof rule["effectiveUntil"] === "string" ? new Date(rule["effectiveUntil"]) : null;
|
|
@@ -507,8 +549,8 @@ var EvaluationResultSchema = {
|
|
|
507
549
|
}).optional()
|
|
508
550
|
}).describe("An EvaluationResult (or simplified result from the evaluate tool)")
|
|
509
551
|
};
|
|
510
|
-
function registerExplainResultTool(
|
|
511
|
-
|
|
552
|
+
function registerExplainResultTool(server2) {
|
|
553
|
+
server2.tool(
|
|
512
554
|
"explain_result",
|
|
513
555
|
"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
556
|
EvaluationResultSchema,
|
|
@@ -573,8 +615,8 @@ var ScenarioSchema = z7.object({
|
|
|
573
615
|
})
|
|
574
616
|
})
|
|
575
617
|
});
|
|
576
|
-
function registerSimulateTool(
|
|
577
|
-
|
|
618
|
+
function registerSimulateTool(server2, engine2) {
|
|
619
|
+
server2.tool(
|
|
578
620
|
"simulate",
|
|
579
621
|
"Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.",
|
|
580
622
|
{
|
|
@@ -594,7 +636,7 @@ function registerSimulateTool(server, engine) {
|
|
|
594
636
|
effectiveDate: scenario.input.meta.effectiveDate ? new Date(scenario.input.meta.effectiveDate) : void 0
|
|
595
637
|
}
|
|
596
638
|
};
|
|
597
|
-
const result = await
|
|
639
|
+
const result = await engine2.evaluate(rules, input);
|
|
598
640
|
results.push({
|
|
599
641
|
label: scenario.label,
|
|
600
642
|
value: result.value,
|
|
@@ -622,11 +664,11 @@ function registerSimulateTool(server, engine) {
|
|
|
622
664
|
}
|
|
623
665
|
|
|
624
666
|
// src/resources/models.ts
|
|
625
|
-
function buildModelsCatalog(
|
|
667
|
+
function buildModelsCatalog(models2) {
|
|
626
668
|
const lines = [];
|
|
627
669
|
lines.push("# Run-IQ Calculation Models");
|
|
628
670
|
lines.push("");
|
|
629
|
-
for (const [, model] of
|
|
671
|
+
for (const [, model] of models2) {
|
|
630
672
|
lines.push(`## ${model.name} (v${model.version})`);
|
|
631
673
|
lines.push("");
|
|
632
674
|
const validation = model.validateParams({});
|
|
@@ -694,15 +736,15 @@ function buildModelsCatalog(models) {
|
|
|
694
736
|
}
|
|
695
737
|
return lines.join("\n");
|
|
696
738
|
}
|
|
697
|
-
function registerModelsResource(
|
|
698
|
-
|
|
739
|
+
function registerModelsResource(server2, models2) {
|
|
740
|
+
server2.resource(
|
|
699
741
|
"models-catalog",
|
|
700
742
|
"models://catalog",
|
|
701
743
|
{
|
|
702
744
|
description: "Documentation of all available calculation models with parameter schemas and usage examples"
|
|
703
745
|
},
|
|
704
746
|
() => {
|
|
705
|
-
const catalog = buildModelsCatalog(
|
|
747
|
+
const catalog = buildModelsCatalog(models2);
|
|
706
748
|
return {
|
|
707
749
|
contents: [
|
|
708
750
|
{
|
|
@@ -717,16 +759,16 @@ function registerModelsResource(server, models) {
|
|
|
717
759
|
}
|
|
718
760
|
|
|
719
761
|
// src/resources/plugins.ts
|
|
720
|
-
function registerPluginsResource(
|
|
721
|
-
|
|
762
|
+
function registerPluginsResource(server2, plugins2, dsls2, registry) {
|
|
763
|
+
server2.resource(
|
|
722
764
|
"plugins-loaded",
|
|
723
765
|
"plugins://loaded",
|
|
724
766
|
{ description: "Information about loaded plugins, DSL evaluators, and their descriptors" },
|
|
725
767
|
() => {
|
|
726
|
-
const
|
|
768
|
+
const descriptors2 = registry.getAll();
|
|
727
769
|
const info = {
|
|
728
|
-
plugins:
|
|
729
|
-
const desc =
|
|
770
|
+
plugins: plugins2.map((p) => {
|
|
771
|
+
const desc = descriptors2.find((d) => d.name === p.name);
|
|
730
772
|
const pluginWithModels = p;
|
|
731
773
|
return {
|
|
732
774
|
name: p.name,
|
|
@@ -736,7 +778,7 @@ function registerPluginsResource(server, plugins, dsls, registry) {
|
|
|
736
778
|
ruleExtensions: desc?.ruleExtensions.map((f) => f.name) ?? []
|
|
737
779
|
};
|
|
738
780
|
}),
|
|
739
|
-
dsls:
|
|
781
|
+
dsls: dsls2.map((d) => ({
|
|
740
782
|
name: d.dsl,
|
|
741
783
|
version: d.version
|
|
742
784
|
}))
|
|
@@ -755,7 +797,7 @@ function registerPluginsResource(server, plugins, dsls, registry) {
|
|
|
755
797
|
}
|
|
756
798
|
|
|
757
799
|
// src/resources/schema.ts
|
|
758
|
-
function buildSchemaDocument(
|
|
800
|
+
function buildSchemaDocument(models2, registry) {
|
|
759
801
|
const lines = [];
|
|
760
802
|
lines.push("# Run-IQ Rule Schema");
|
|
761
803
|
lines.push("");
|
|
@@ -778,11 +820,11 @@ function buildSchemaDocument(models, registry) {
|
|
|
778
820
|
lines.push("| checksum | string | auto | SHA-256 of params (auto-computed by create_rule) |");
|
|
779
821
|
lines.push("| condition | {dsl,value} | optional | DSL condition (e.g. jsonlogic) |");
|
|
780
822
|
lines.push("");
|
|
781
|
-
const
|
|
782
|
-
if (
|
|
823
|
+
const descriptors2 = registry.getAll();
|
|
824
|
+
if (descriptors2.length > 0) {
|
|
783
825
|
lines.push("## Plugin Extension Fields");
|
|
784
826
|
lines.push("");
|
|
785
|
-
for (const desc of
|
|
827
|
+
for (const desc of descriptors2) {
|
|
786
828
|
lines.push(`### ${desc.name} (v${desc.version})`);
|
|
787
829
|
lines.push("");
|
|
788
830
|
lines.push(desc.description);
|
|
@@ -800,7 +842,7 @@ function buildSchemaDocument(models, registry) {
|
|
|
800
842
|
}
|
|
801
843
|
lines.push("## Available Calculation Models");
|
|
802
844
|
lines.push("");
|
|
803
|
-
for (const [, model] of
|
|
845
|
+
for (const [, model] of models2) {
|
|
804
846
|
lines.push(`### ${model.name} (v${model.version})`);
|
|
805
847
|
lines.push("");
|
|
806
848
|
const validation = model.validateParams({});
|
|
@@ -867,8 +909,8 @@ function buildSchemaDocument(models, registry) {
|
|
|
867
909
|
}
|
|
868
910
|
return lines.join("\n");
|
|
869
911
|
}
|
|
870
|
-
function registerSchemaResource(
|
|
871
|
-
|
|
912
|
+
function registerSchemaResource(server2, models2, registry) {
|
|
913
|
+
server2.resource(
|
|
872
914
|
"rule-schema",
|
|
873
915
|
"schema://rules",
|
|
874
916
|
{
|
|
@@ -879,7 +921,7 @@ function registerSchemaResource(server, models, registry) {
|
|
|
879
921
|
{
|
|
880
922
|
uri: "schema://rules",
|
|
881
923
|
mimeType: "text/markdown",
|
|
882
|
-
text: buildSchemaDocument(
|
|
924
|
+
text: buildSchemaDocument(models2, registry)
|
|
883
925
|
}
|
|
884
926
|
]
|
|
885
927
|
})
|
|
@@ -889,13 +931,13 @@ function registerSchemaResource(server, models, registry) {
|
|
|
889
931
|
// src/prompts/analyze-text.ts
|
|
890
932
|
import { z as z8 } from "zod";
|
|
891
933
|
function buildDomainLabel(registry) {
|
|
892
|
-
const
|
|
893
|
-
if (
|
|
894
|
-
return
|
|
934
|
+
const descriptors2 = registry.getAll();
|
|
935
|
+
if (descriptors2.length === 0) return "policy";
|
|
936
|
+
return descriptors2.map((d) => d.domainLabel).join(" / ");
|
|
895
937
|
}
|
|
896
|
-
function buildModelDocs(
|
|
938
|
+
function buildModelDocs(models2) {
|
|
897
939
|
const lines = [];
|
|
898
|
-
for (const [, model] of
|
|
940
|
+
for (const [, model] of models2) {
|
|
899
941
|
const validation = model.validateParams({});
|
|
900
942
|
const paramHints = validation.errors ? validation.errors.join("; ") : "none";
|
|
901
943
|
lines.push(`- **${model.name}** (v${model.version}): ${paramHints}`);
|
|
@@ -903,10 +945,10 @@ function buildModelDocs(models) {
|
|
|
903
945
|
return lines.join("\n");
|
|
904
946
|
}
|
|
905
947
|
function buildExtensionDocs(registry) {
|
|
906
|
-
const
|
|
907
|
-
if (
|
|
948
|
+
const descriptors2 = registry.getAll();
|
|
949
|
+
if (descriptors2.length === 0) return "";
|
|
908
950
|
const lines = [];
|
|
909
|
-
for (const desc of
|
|
951
|
+
for (const desc of descriptors2) {
|
|
910
952
|
lines.push(`
|
|
911
953
|
### Plugin: ${desc.name}`);
|
|
912
954
|
lines.push(desc.description);
|
|
@@ -946,9 +988,9 @@ function buildInputDocs(registry) {
|
|
|
946
988
|
return lines.join("\n");
|
|
947
989
|
}
|
|
948
990
|
function buildGuidelinesSection(registry) {
|
|
949
|
-
const
|
|
991
|
+
const descriptors2 = registry.getAll();
|
|
950
992
|
const lines = [];
|
|
951
|
-
for (const desc of
|
|
993
|
+
for (const desc of descriptors2) {
|
|
952
994
|
if (desc.promptGuidelines.length > 0) {
|
|
953
995
|
lines.push(`
|
|
954
996
|
## ${desc.domainLabel} Guidelines`);
|
|
@@ -959,9 +1001,9 @@ function buildGuidelinesSection(registry) {
|
|
|
959
1001
|
}
|
|
960
1002
|
return lines.join("\n");
|
|
961
1003
|
}
|
|
962
|
-
function registerAnalyzeTextPrompt(
|
|
1004
|
+
function registerAnalyzeTextPrompt(server2, models2, registry) {
|
|
963
1005
|
const domainLabel = buildDomainLabel(registry);
|
|
964
|
-
|
|
1006
|
+
server2.prompt(
|
|
965
1007
|
"analyze-text",
|
|
966
1008
|
`Translate a ${domainLabel} text (law, regulation, policy) into Run-IQ rule definitions. Plugin-aware: includes all required fields.`,
|
|
967
1009
|
{
|
|
@@ -978,7 +1020,7 @@ function registerAnalyzeTextPrompt(server, models, registry) {
|
|
|
978
1020
|
text: `You are an expert at translating regulatory and policy texts into structured Run-IQ rules.
|
|
979
1021
|
|
|
980
1022
|
## Available Calculation Models
|
|
981
|
-
${buildModelDocs(
|
|
1023
|
+
${buildModelDocs(models2)}
|
|
982
1024
|
${buildExtensionDocs(registry)}
|
|
983
1025
|
${buildInputDocs(registry)}
|
|
984
1026
|
${buildGuidelinesSection(registry)}
|
|
@@ -1012,9 +1054,9 @@ ${args.source_text}`
|
|
|
1012
1054
|
// src/prompts/domain-expert.ts
|
|
1013
1055
|
import { z as z9 } from "zod";
|
|
1014
1056
|
function buildGuidelinesSection2(registry) {
|
|
1015
|
-
const
|
|
1057
|
+
const descriptors2 = registry.getAll();
|
|
1016
1058
|
const allGuidelines = [];
|
|
1017
|
-
for (const desc of
|
|
1059
|
+
for (const desc of descriptors2) {
|
|
1018
1060
|
if (desc.promptGuidelines.length > 0) {
|
|
1019
1061
|
allGuidelines.push(`### ${desc.name} (${desc.domainLabel})`);
|
|
1020
1062
|
for (const g of desc.promptGuidelines) {
|
|
@@ -1027,15 +1069,15 @@ function buildGuidelinesSection2(registry) {
|
|
|
1027
1069
|
${allGuidelines.join("\n")}`;
|
|
1028
1070
|
}
|
|
1029
1071
|
function buildDomainLabel2(registry) {
|
|
1030
|
-
const
|
|
1031
|
-
if (
|
|
1032
|
-
return
|
|
1072
|
+
const descriptors2 = registry.getAll();
|
|
1073
|
+
if (descriptors2.length === 0) return "general-purpose";
|
|
1074
|
+
return descriptors2.map((d) => d.domainLabel).join(" + ");
|
|
1033
1075
|
}
|
|
1034
|
-
function registerDomainExpertPrompt(
|
|
1035
|
-
const
|
|
1076
|
+
function registerDomainExpertPrompt(server2, registry) {
|
|
1077
|
+
const descriptors2 = registry.getAll();
|
|
1036
1078
|
const domainLabel = buildDomainLabel2(registry);
|
|
1037
|
-
const pluginList =
|
|
1038
|
-
|
|
1079
|
+
const pluginList = descriptors2.map((d) => `- ${d.name}: ${d.description}`).join("\n");
|
|
1080
|
+
server2.prompt(
|
|
1039
1081
|
"domain-expert",
|
|
1040
1082
|
`${domainLabel} calculation expertise: scenario comparison, result explanation, recommendations`,
|
|
1041
1083
|
{
|
|
@@ -1088,7 +1130,7 @@ ${args.question}`
|
|
|
1088
1130
|
// package.json
|
|
1089
1131
|
var package_default = {
|
|
1090
1132
|
name: "@run-iq/mcp-server",
|
|
1091
|
-
version: "0.1.
|
|
1133
|
+
version: "0.1.9",
|
|
1092
1134
|
description: "MCP server exposing the PPE engine to LLMs via stdio",
|
|
1093
1135
|
type: "module",
|
|
1094
1136
|
main: "./dist/index.js",
|
|
@@ -1148,67 +1190,55 @@ var package_default = {
|
|
|
1148
1190
|
var VERSION = package_default.version;
|
|
1149
1191
|
|
|
1150
1192
|
// src/index.ts
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
npmPlugins.push(argv[i + 1]);
|
|
1162
|
-
i++;
|
|
1163
|
-
}
|
|
1164
|
-
}
|
|
1165
|
-
const bundles = [];
|
|
1166
|
-
if (pluginsDir) {
|
|
1167
|
-
const dirBundles = await loadPluginsFromDir(pluginsDir);
|
|
1168
|
-
bundles.push(...dirBundles);
|
|
1169
|
-
}
|
|
1170
|
-
if (npmPlugins.length > 0) {
|
|
1171
|
-
const npmBundles = await loadNpmPlugins(npmPlugins);
|
|
1172
|
-
bundles.push(...npmBundles);
|
|
1173
|
-
}
|
|
1174
|
-
const { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);
|
|
1175
|
-
const descriptors = descriptorRegistry.getAll();
|
|
1176
|
-
const server = new McpServer(
|
|
1177
|
-
{
|
|
1178
|
-
name: "@run-iq/mcp-server",
|
|
1179
|
-
version: VERSION
|
|
1180
|
-
},
|
|
1181
|
-
{
|
|
1182
|
-
capabilities: {
|
|
1183
|
-
tools: {},
|
|
1184
|
-
resources: {},
|
|
1185
|
-
prompts: {}
|
|
1186
|
-
}
|
|
1187
|
-
}
|
|
1188
|
-
);
|
|
1189
|
-
registerCreateChecksumTool(server);
|
|
1190
|
-
registerCreateRuleTool(server, descriptors);
|
|
1191
|
-
registerValidateRulesTool(server, models, descriptors);
|
|
1192
|
-
registerListModelsTool(server, models);
|
|
1193
|
-
registerEvaluateTool(server, engine);
|
|
1194
|
-
registerInspectRuleTool(server, models, descriptors);
|
|
1195
|
-
registerExplainResultTool(server);
|
|
1196
|
-
registerSimulateTool(server, engine);
|
|
1197
|
-
registerModelsResource(server, models);
|
|
1198
|
-
registerPluginsResource(server, plugins, dsls, descriptorRegistry);
|
|
1199
|
-
registerSchemaResource(server, models, descriptorRegistry);
|
|
1200
|
-
registerAnalyzeTextPrompt(server, models, descriptorRegistry);
|
|
1201
|
-
registerDomainExpertPrompt(server, descriptorRegistry);
|
|
1202
|
-
const transport = new StdioServerTransport();
|
|
1203
|
-
await server.connect(transport);
|
|
1204
|
-
console.error(`[MCP] Server v${VERSION} started successfully with ${bundles.length} plugins.`);
|
|
1205
|
-
} catch (error) {
|
|
1206
|
-
console.error("[MCP] Fatal error during startup:", error);
|
|
1207
|
-
process.exit(1);
|
|
1193
|
+
var pluginsDir;
|
|
1194
|
+
var npmPlugins = [];
|
|
1195
|
+
var argv = process.argv.slice(2);
|
|
1196
|
+
for (let i = 0; i < argv.length; i++) {
|
|
1197
|
+
if (argv[i] === "--plugins-dir" && argv[i + 1]) {
|
|
1198
|
+
pluginsDir = argv[i + 1];
|
|
1199
|
+
i++;
|
|
1200
|
+
} else if (argv[i] === "--plugin" && argv[i + 1]) {
|
|
1201
|
+
npmPlugins.push(argv[i + 1]);
|
|
1202
|
+
i++;
|
|
1208
1203
|
}
|
|
1209
1204
|
}
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1205
|
+
var bundles = [];
|
|
1206
|
+
if (pluginsDir) {
|
|
1207
|
+
const dirBundles = await loadPluginsFromDir(pluginsDir);
|
|
1208
|
+
bundles.push(...dirBundles);
|
|
1209
|
+
}
|
|
1210
|
+
if (npmPlugins.length > 0) {
|
|
1211
|
+
const npmBundles = await loadNpmPlugins(npmPlugins);
|
|
1212
|
+
bundles.push(...npmBundles);
|
|
1213
|
+
}
|
|
1214
|
+
var { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);
|
|
1215
|
+
var descriptors = descriptorRegistry.getAll();
|
|
1216
|
+
var server = new McpServer(
|
|
1217
|
+
{
|
|
1218
|
+
name: "@run-iq/mcp-server",
|
|
1219
|
+
version: VERSION
|
|
1220
|
+
},
|
|
1221
|
+
{
|
|
1222
|
+
capabilities: {
|
|
1223
|
+
tools: {},
|
|
1224
|
+
resources: {},
|
|
1225
|
+
prompts: {}
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
);
|
|
1229
|
+
registerCreateChecksumTool(server);
|
|
1230
|
+
registerCreateRuleTool(server, descriptors);
|
|
1231
|
+
registerValidateRulesTool(server, models, descriptors);
|
|
1232
|
+
registerListModelsTool(server, models);
|
|
1233
|
+
registerEvaluateTool(server, engine);
|
|
1234
|
+
registerInspectRuleTool(server, models, descriptors);
|
|
1235
|
+
registerExplainResultTool(server);
|
|
1236
|
+
registerSimulateTool(server, engine);
|
|
1237
|
+
registerModelsResource(server, models);
|
|
1238
|
+
registerPluginsResource(server, plugins, dsls, descriptorRegistry);
|
|
1239
|
+
registerSchemaResource(server, models, descriptorRegistry);
|
|
1240
|
+
registerAnalyzeTextPrompt(server, models, descriptorRegistry);
|
|
1241
|
+
registerDomainExpertPrompt(server, descriptorRegistry);
|
|
1242
|
+
var transport = new StdioServerTransport();
|
|
1243
|
+
await server.connect(transport);
|
|
1214
1244
|
//# 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\nasync function main() {\n try {\n // Parse CLI arguments\n let pluginsDir: 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 }\n }\n\n // Load plugin bundles\n const bundles: PluginBundle[] = [];\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 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);\n registerListModelsTool(server, models);\n registerEvaluateTool(server, engine);\n registerInspectRuleTool(server, models, descriptors);\n registerExplainResultTool(server);\n registerSimulateTool(server, engine);\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 { 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.8\",\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":["require","createHash","z","createHash","createHash","z","z","createHash","z","createHash","z","z","createHash","z","z","hydrateRules","examples","z","z","buildGuidelinesSection","buildDomainLabel"]}
|
|
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';\r\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\r\nimport { createEngine } from './engine.js';\r\nimport { loadPluginsFromDir, loadNpmPlugins } from './loader/plugin-loader.js';\r\nimport { registerCreateChecksumTool } from './tools/create-checksum.js';\r\nimport { registerCreateRuleTool } from './tools/create-rule.js';\r\nimport { registerValidateRulesTool } from './tools/validate.js';\r\nimport { registerListModelsTool } from './tools/list-models.js';\r\nimport { registerEvaluateTool } from './tools/evaluate.js';\r\nimport { registerInspectRuleTool } from './tools/inspect-rule.js';\r\nimport { registerExplainResultTool } from './tools/explain.js';\r\nimport { registerSimulateTool } from './tools/simulate.js';\r\nimport { registerModelsResource } from './resources/models.js';\r\nimport { registerPluginsResource } from './resources/plugins.js';\r\nimport { registerSchemaResource } from './resources/schema.js';\r\nimport { registerAnalyzeTextPrompt } from './prompts/analyze-text.js';\r\nimport { registerDomainExpertPrompt } from './prompts/domain-expert.js';\r\nimport { VERSION } from './utils/version.js';\r\n\r\n// Parse CLI arguments\r\nlet pluginsDir: string | undefined;\r\nconst npmPlugins: string[] = [];\r\nconst argv = process.argv.slice(2);\r\nfor (let i = 0; i < argv.length; i++) {\r\n if (argv[i] === '--plugins-dir' && argv[i + 1]) {\r\n pluginsDir = argv[i + 1];\r\n i++;\r\n } else if (argv[i] === '--plugin' && argv[i + 1]) {\r\n npmPlugins.push(argv[i + 1]!);\r\n i++;\r\n }\r\n}\r\n\r\n// Load plugin bundles\r\nconst bundles: PluginBundle[] = [];\r\nif (pluginsDir) {\r\n const dirBundles = await loadPluginsFromDir(pluginsDir);\r\n bundles.push(...dirBundles);\r\n}\r\nif (npmPlugins.length > 0) {\r\n const npmBundles = await loadNpmPlugins(npmPlugins);\r\n bundles.push(...npmBundles);\r\n}\r\n\r\nconst { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);\r\nconst descriptors = descriptorRegistry.getAll();\r\n\r\nconst server = new McpServer(\r\n {\r\n name: '@run-iq/mcp-server',\r\n version: VERSION,\r\n },\r\n {\r\n capabilities: {\r\n tools: {},\r\n resources: {},\r\n prompts: {},\r\n },\r\n },\r\n);\r\n\r\n// Tools\r\nregisterCreateChecksumTool(server);\r\nregisterCreateRuleTool(server, descriptors);\r\nregisterValidateRulesTool(server, models, descriptors);\r\nregisterListModelsTool(server, models);\r\nregisterEvaluateTool(server, engine);\r\nregisterInspectRuleTool(server, models, descriptors);\r\nregisterExplainResultTool(server);\r\nregisterSimulateTool(server, engine);\r\n\r\n// Resources\r\nregisterModelsResource(server, models);\r\nregisterPluginsResource(server, plugins, dsls, descriptorRegistry);\r\nregisterSchemaResource(server, models, descriptorRegistry);\r\n\r\n// Prompts\r\nregisterAnalyzeTextPrompt(server, models, descriptorRegistry);\r\nregisterDomainExpertPrompt(server, descriptorRegistry);\r\n\r\n// Start stdio transport\r\nconst transport = new StdioServerTransport();\r\nawait server.connect(transport);\r\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 { execSync } from 'node:child_process';\r\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\r\nimport { readdir } from 'node:fs/promises';\r\nimport { resolve, join } from 'node:path';\r\nimport { pathToFileURL } from 'node:url';\r\nimport { createRequire } from 'node:module';\r\nimport { homedir } from 'node:os';\r\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\r\n\r\nconst require = createRequire(import.meta.url);\r\nconst AUTO_PLUGINS_DIR = resolve(homedir(), '.run-iq', 'mcp-plugins');\r\n\r\n/**\r\n * Loads all plugin bundles from a directory.\r\n */\r\nexport async function loadPluginsFromDir(dir: string): Promise<PluginBundle[]> {\r\n const bundles: PluginBundle[] = [];\r\n const absoluteDir = resolve(dir);\r\n\r\n if (!existsSync(absoluteDir)) return [];\r\n\r\n const entries = await readdir(absoluteDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n if (!entry.isFile() || !/\\.(mjs|js)$/.test(entry.name)) continue;\r\n\r\n const filePath = resolve(absoluteDir, entry.name);\r\n const bundle = await importBundle(pathToFileURL(filePath).href);\r\n if (bundle) bundles.push(bundle);\r\n }\r\n\r\n return bundles;\r\n}\r\n\r\n/**\r\n * Loads plugin bundles from NPM packages, installing them if necessary.\r\n */\r\nexport async function loadNpmPlugins(packageNames: string[]): Promise<PluginBundle[]> {\r\n const bundles: PluginBundle[] = [];\r\n\r\n for (const pkgName of packageNames) {\r\n try {\r\n const resolvedPath = await resolveOrInstallPlugin(pkgName);\r\n const bundle = await importBundle(pathToFileURL(resolvedPath).href);\r\n\r\n if (bundle) {\r\n bundles.push(bundle);\r\n } else {\r\n console.error(`[PluginLoader] Invalid PluginBundle in package: ${pkgName}`);\r\n }\r\n } catch (err) {\r\n console.error(`[PluginLoader] Failed to load NPM plugin \"${pkgName}\":`, err instanceof Error ? err.message : err);\r\n }\r\n }\r\n\r\n return bundles;\r\n}\r\n\r\n/**\r\n * Attempts to resolve a plugin package, installing it in .mcp-plugins if not found.\r\n */\r\nasync function resolveOrInstallPlugin(pkgName: string): Promise<string> {\r\n // 1. Try local node_modules first\r\n try {\r\n return require.resolve(pkgName, { paths: [process.cwd()] });\r\n } catch {\r\n /* Not found locally */\r\n }\r\n\r\n // 2. Try .mcp-plugins directory\r\n try {\r\n return require.resolve(pkgName, { paths: [AUTO_PLUGINS_DIR] });\r\n } catch {\r\n /* Not found in auto-plugins dir */\r\n }\r\n\r\n // 3. Install dynamically\r\n ensurePluginsDir();\r\n console.log(`[PluginLoader] Installing ${pkgName} dynamically...`);\r\n \r\n execSync(`npm install ${pkgName} --no-save`, {\r\n cwd: AUTO_PLUGINS_DIR,\r\n stdio: 'inherit',\r\n });\r\n\r\n return require.resolve(pkgName, { paths: [AUTO_PLUGINS_DIR] });\r\n}\r\n\r\n/**\r\n * Ensures the .mcp-plugins directory exists and is initialized.\r\n */\r\nfunction ensurePluginsDir(): void {\r\n if (!existsSync(AUTO_PLUGINS_DIR)) {\r\n mkdirSync(AUTO_PLUGINS_DIR, { recursive: true });\r\n writeFileSync(\r\n join(AUTO_PLUGINS_DIR, 'package.json'),\r\n JSON.stringify({ name: 'mcp-plugins', private: true, version: '1.0.0' }, null, 2),\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Safely imports a module and extracts the PluginBundle.\r\n */\r\nasync function importBundle(url: string): Promise<PluginBundle | null> {\r\n try {\r\n const mod = await import(url);\r\n let bundle = (mod.default ?? mod) as any;\r\n\r\n // Handle bundles nested under a 'bundle' property (common in some build setups)\r\n if (!bundle.plugin && bundle.bundle?.plugin) {\r\n bundle = bundle.bundle;\r\n }\r\n\r\n if (isValidBundle(bundle)) {\r\n return bundle as PluginBundle;\r\n }\r\n } catch (err) {\r\n console.error(`[PluginLoader] Import error for ${url}:`, err);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Validates that an object conforms to the PluginBundle interface.\r\n */\r\nfunction isValidBundle(obj: any): boolean {\r\n return (\r\n obj &&\r\n typeof obj === 'object' &&\r\n typeof obj.plugin === 'object' &&\r\n typeof obj.descriptor === 'object'\r\n );\r\n}\r\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';\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { CalculationModel } from '@run-iq/core';\r\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\r\nimport { buildValidateExtensionErrors } from './schema-builder.js';\r\n\r\nconst RuleSchema = z.object({\r\n id: z.string(),\r\n version: z.number(),\r\n model: z.string(),\r\n params: z.unknown(),\r\n priority: z.number().optional(),\r\n effectiveFrom: z.string(),\r\n effectiveUntil: z.string().nullable(),\r\n tags: z.array(z.string()),\r\n checksum: z.string(),\r\n condition: z.object({ dsl: z.string(), value: z.unknown() }).optional(),\r\n});\r\n\r\ninterface ValidationEntry {\r\n ruleId: string;\r\n valid: boolean;\r\n errors?: string[];\r\n}\r\n\r\nexport function registerValidateRulesTool(\r\n server: McpServer,\r\n models: ReadonlyMap<string, CalculationModel>,\r\n descriptors: readonly PluginDescriptor[],\r\n): void {\r\n server.tool(\r\n 'validate_rules',\r\n 'Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.',\r\n {\r\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects to validate'),\r\n },\r\n (args) => {\r\n const entries: ValidationEntry[] = [];\r\n\r\n for (const raw of args.rules) {\r\n const parsed = RuleSchema.safeParse(raw);\r\n const ruleId = typeof raw['id'] === 'string' ? raw['id'] : 'unknown';\r\n\r\n if (!parsed.success) {\r\n entries.push({\r\n ruleId,\r\n valid: false,\r\n errors: parsed.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`),\r\n });\r\n continue;\r\n }\r\n\r\n const rule = parsed.data;\r\n const errors: string[] = [];\r\n\r\n // Checksum verification\r\n const computed = createHash('sha256').update(JSON.stringify(rule.params)).digest('hex');\r\n if (computed !== rule.checksum) {\r\n errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);\r\n }\r\n\r\n // Model existence\r\n const model = models.get(rule.model);\r\n if (!model) {\r\n errors.push(\r\n `Model \"${rule.model}\" not found. Available: ${[...models.keys()].join(', ')}`,\r\n );\r\n } else {\r\n // Param validation via model\r\n const validation = model.validateParams(rule.params);\r\n if (!validation.valid && validation.errors) {\r\n errors.push(...validation.errors);\r\n }\r\n }\r\n\r\n // Plugin extension validation\r\n const extensionErrors = buildValidateExtensionErrors(raw, descriptors);\r\n errors.push(...extensionErrors);\r\n\r\n entries.push({\r\n ruleId: rule.id,\r\n valid: errors.length === 0,\r\n ...(errors.length > 0 ? { errors } : {}),\r\n });\r\n }\r\n\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify({ entries }, null, 2) }],\r\n };\r\n },\r\n );\r\n}\r\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';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { PPEEngine } from '@run-iq/core';\r\nimport { hydrateRules } from '@run-iq/core';\r\n\r\nexport function registerEvaluateTool(server: McpServer, engine: PPEEngine): void {\r\n server.tool(\r\n 'evaluate',\r\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.',\r\n {\r\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects'),\r\n input: z\r\n .object({\r\n data: z.record(z.unknown()).describe('Input data for evaluation'),\r\n requestId: z.string().describe('Unique request identifier'),\r\n meta: z.object({\r\n tenantId: z.string().describe('Tenant identifier'),\r\n userId: z.string().optional().describe('User identifier'),\r\n tags: z.array(z.string()).optional().describe('Tags for rule filtering'),\r\n context: z.record(z.unknown()).optional().describe('Additional context'),\r\n effectiveDate: z\r\n .string()\r\n .optional()\r\n .describe('ISO 8601 date for effective date evaluation'),\r\n }),\r\n })\r\n .describe('Evaluation input'),\r\n },\r\n async (args) => {\r\n try {\r\n const rules = hydrateRules(args.rules);\r\n\r\n const input = {\r\n data: args.input.data,\r\n requestId: args.input.requestId,\r\n meta: {\r\n ...args.input.meta,\r\n effectiveDate: args.input.meta.effectiveDate\r\n ? new Date(args.input.meta.effectiveDate)\r\n : undefined,\r\n },\r\n };\r\n\r\n const result = await engine.evaluate(rules, input);\r\n\r\n const serializable = {\r\n value: result.value,\r\n breakdown: result.breakdown,\r\n appliedRules: result.appliedRules.map((r) => ({\r\n id: r.id,\r\n model: r.model,\r\n priority: r.priority,\r\n })),\r\n skippedRules: result.skippedRules.map((s) => ({\r\n ruleId: s.rule.id,\r\n reason: s.reason,\r\n })),\r\n trace: {\r\n steps: result.trace.steps.map((s) => ({\r\n ruleId: s.ruleId,\r\n modelUsed: s.modelUsed,\r\n contribution: s.contribution,\r\n durationMs: s.durationMs,\r\n })),\r\n totalDurationMs: result.trace.totalDurationMs,\r\n },\r\n };\r\n\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify(serializable, null, 2) }],\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n}\r\n","import { createHash } from 'node:crypto';\r\nimport { z } from 'zod';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { CalculationModel } from '@run-iq/core';\r\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\r\nimport { buildValidateExtensionErrors } from './schema-builder.js';\r\n\r\nexport function registerInspectRuleTool(\r\n server: McpServer,\r\n models: ReadonlyMap<string, CalculationModel>,\r\n descriptors: readonly PluginDescriptor[],\r\n): void {\r\n server.tool(\r\n 'inspect_rule',\r\n 'Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.',\r\n {\r\n rule: z.record(z.unknown()).describe('A single Rule JSON object to inspect'),\r\n },\r\n (args) => {\r\n const rule = args.rule;\r\n const id = typeof rule['id'] === 'string' ? rule['id'] : 'unknown';\r\n const modelName = typeof rule['model'] === 'string' ? rule['model'] : '';\r\n const params = rule['params'];\r\n const checksum = typeof rule['checksum'] === 'string' ? rule['checksum'] : '';\r\n\r\n // Checksum match\r\n const computed = createHash('sha256').update(JSON.stringify(params)).digest('hex');\r\n const checksumMatch = computed === checksum;\r\n\r\n // Model found\r\n const model = models.get(modelName);\r\n const modelFound = model !== undefined;\r\n\r\n // Param validation\r\n let paramErrors: string[] | undefined;\r\n if (model) {\r\n const validation = model.validateParams(params);\r\n if (!validation.valid && validation.errors) {\r\n paramErrors = [...validation.errors];\r\n }\r\n }\r\n\r\n // Plugin extension validation\r\n const extensionErrors = buildValidateExtensionErrors(rule, descriptors);\r\n\r\n // Active date check\r\n const now = new Date();\r\n const effectiveFrom =\r\n typeof rule['effectiveFrom'] === 'string' ? new Date(rule['effectiveFrom']) : null;\r\n const effectiveUntil =\r\n typeof rule['effectiveUntil'] === 'string' ? new Date(rule['effectiveUntil']) : null;\r\n\r\n const isActive =\r\n effectiveFrom !== null &&\r\n effectiveFrom <= now &&\r\n (effectiveUntil === null || effectiveUntil > now);\r\n\r\n const effectivePeriod = {\r\n from: effectiveFrom?.toISOString() ?? null,\r\n until: effectiveUntil?.toISOString() ?? null,\r\n };\r\n\r\n const allErrors = [...(paramErrors ?? []), ...extensionErrors];\r\n const valid = checksumMatch && modelFound && allErrors.length === 0 && isActive;\r\n\r\n const result: Record<string, unknown> = {\r\n ruleId: id,\r\n valid,\r\n checksumMatch,\r\n modelFound,\r\n isActive,\r\n effectivePeriod,\r\n };\r\n\r\n if (paramErrors && paramErrors.length > 0) {\r\n result['paramErrors'] = paramErrors;\r\n }\r\n if (extensionErrors.length > 0) {\r\n result['extensionErrors'] = extensionErrors;\r\n }\r\n\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],\r\n };\r\n },\r\n );\r\n}\r\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';\r\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\r\nimport type { PPEEngine } from '@run-iq/core';\r\nimport { hydrateRules } from '@run-iq/core';\r\n\r\nconst ScenarioSchema = z.object({\r\n label: z.string().describe('Human-readable scenario label'),\r\n input: z.object({\r\n data: z.record(z.unknown()),\r\n requestId: z.string(),\r\n meta: z.object({\r\n tenantId: z.string(),\r\n userId: z.string().optional(),\r\n tags: z.array(z.string()).optional(),\r\n context: z.record(z.unknown()).optional(),\r\n effectiveDate: z.string().optional(),\r\n }),\r\n }),\r\n});\r\n\r\nexport function registerSimulateTool(server: McpServer, engine: PPEEngine): void {\r\n server.tool(\r\n 'simulate',\r\n 'Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.',\r\n {\r\n rules: z\r\n .array(z.record(z.unknown()))\r\n .describe('Array of Rule JSON objects (shared across all scenarios)'),\r\n scenarios: z.array(ScenarioSchema).min(1).describe('Array of scenarios to compare'),\r\n },\r\n async (args) => {\r\n try {\r\n const rules = hydrateRules(args.rules);\r\n\r\n const results = [];\r\n for (const scenario of args.scenarios) {\r\n const input = {\r\n data: scenario.input.data,\r\n requestId: scenario.input.requestId,\r\n meta: {\r\n ...scenario.input.meta,\r\n effectiveDate: scenario.input.meta.effectiveDate\r\n ? new Date(scenario.input.meta.effectiveDate)\r\n : undefined,\r\n },\r\n };\r\n\r\n const result = await engine.evaluate(rules, input);\r\n\r\n results.push({\r\n label: scenario.label,\r\n value: result.value,\r\n appliedCount: result.appliedRules.length,\r\n skippedCount: result.skippedRules.length,\r\n breakdown: result.breakdown.map((b) => ({\r\n ruleId: b.ruleId,\r\n contribution: b.contribution,\r\n modelUsed: b.modelUsed,\r\n })),\r\n });\r\n }\r\n\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify({ results }, null, 2) }],\r\n };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return {\r\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\r\n isError: true,\r\n };\r\n }\r\n },\r\n );\r\n}\r\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","{\r\n \"name\": \"@run-iq/mcp-server\",\r\n \"version\": \"0.1.9\",\r\n \"description\": \"MCP server exposing the PPE engine to LLMs via stdio\",\r\n \"type\": \"module\",\r\n \"main\": \"./dist/index.js\",\r\n \"types\": \"./dist/index.d.ts\",\r\n \"bin\": {\r\n \"run-iq-mcp\": \"./dist/index.js\",\r\n \"mcp-server\": \"./dist/index.js\"\r\n },\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/index.d.ts\",\r\n \"default\": \"./dist/index.js\"\r\n }\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"tsup\",\r\n \"test\": \"vitest run\",\r\n \"typecheck\": \"tsc --noEmit\",\r\n \"lint\": \"eslint src/ tests/ && prettier --check src/ tests/\",\r\n \"lint:fix\": \"eslint src/ tests/ --fix && prettier --write src/ tests/\"\r\n },\r\n \"dependencies\": {\r\n \"@modelcontextprotocol/sdk\": \"^1.27.0\",\r\n \"@run-iq/core\": \"^0.2.0\",\r\n \"@run-iq/plugin-sdk\": \"^0.2.2\",\r\n \"zod\": \"^3.23.0\"\r\n },\r\n \"devDependencies\": {\r\n \"@types/node\": \"^20.11.0\",\r\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\r\n \"@typescript-eslint/parser\": \"^7.0.0\",\r\n \"eslint\": \"^8.57.0\",\r\n \"prettier\": \"^3.2.0\",\r\n \"tsup\": \"^8.0.0\",\r\n \"typescript\": \"^5.7.0\",\r\n \"vitest\": \"^3.0.0\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/Run-IQ/mcp-server.git\"\r\n },\r\n \"homepage\": \"https://github.com/Run-IQ/mcp-server#readme\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/Run-IQ/mcp-server/issues\"\r\n },\r\n \"author\": \"Abdou-Raouf ATARMLA\",\r\n \"license\": \"MIT\",\r\n \"engines\": {\r\n \"node\": \">=20.0.0\"\r\n }\r\n}\r\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"]}
|
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.10",
|
|
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
|
+
}
|