@run-iq/mcp-server 0.1.8 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
+ import fs from "fs/promises";
5
+ import path2 from "path";
4
6
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
7
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
6
8
 
@@ -77,6 +79,7 @@ function createEngine(bundles) {
77
79
  // src/loader/plugin-loader.ts
78
80
  import { readdir } from "fs/promises";
79
81
  import { resolve } from "path";
82
+ import path from "path";
80
83
  import { pathToFileURL } from "url";
81
84
  import { createRequire } from "module";
82
85
  var require2 = createRequire(import.meta.url);
@@ -100,18 +103,23 @@ async function loadNpmPlugins(packageNames) {
100
103
  const bundles = [];
101
104
  for (const pkgName of packageNames) {
102
105
  try {
103
- const resolvedPath = require2.resolve(pkgName, { paths: [process.cwd()] });
106
+ let resolvedPath;
107
+ if (pkgName.startsWith(".") || pkgName.startsWith("/") || pkgName.includes(":")) {
108
+ resolvedPath = path.resolve(process.cwd(), pkgName);
109
+ } else {
110
+ resolvedPath = require2.resolve(pkgName, { paths: [process.cwd()] });
111
+ }
104
112
  const mod = await import(pathToFileURL(resolvedPath).href);
105
113
  const bundle = mod["default"] ?? mod["bundle"] ?? mod;
106
114
  if (bundle && typeof bundle === "object" && bundle["plugin"] && bundle["descriptor"]) {
107
115
  bundles.push(bundle);
108
116
  } else {
109
117
  console.error(
110
- `[MCP] Invalid PluginBundle exported by NPM package "${pkgName}". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`
118
+ `[MCP] Invalid PluginBundle exported by "${pkgName}". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`
111
119
  );
112
120
  }
113
121
  } catch (err) {
114
- console.error(`[MCP] Failed to load NPM plugin: ${pkgName}`, err);
122
+ console.error(`[MCP] Failed to load plugin "${pkgName}":`, err instanceof Error ? err.message : err);
115
123
  }
116
124
  }
117
125
  return bundles;
@@ -263,16 +271,17 @@ var RuleSchema = z3.object({
263
271
  checksum: z3.string(),
264
272
  condition: z3.object({ dsl: z3.string(), value: z3.unknown() }).optional()
265
273
  });
266
- function registerValidateRulesTool(server, models, descriptors) {
274
+ function registerValidateRulesTool(server, models, descriptors, initialRules = []) {
267
275
  server.tool(
268
276
  "validate_rules",
269
277
  "Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.",
270
278
  {
271
- rules: z3.array(z3.record(z3.unknown())).describe("Array of Rule JSON objects to validate")
279
+ rules: z3.array(z3.record(z3.unknown())).optional().describe("Array of Rule JSON objects to validate")
272
280
  },
273
281
  (args) => {
274
282
  const entries = [];
275
- for (const raw of args.rules) {
283
+ const rulesToValidate = [...initialRules, ...args.rules || []];
284
+ for (const raw of rulesToValidate) {
276
285
  const parsed = RuleSchema.safeParse(raw);
277
286
  const ruleId = typeof raw["id"] === "string" ? raw["id"] : "unknown";
278
287
  if (!parsed.success) {
@@ -350,7 +359,7 @@ function registerListModelsTool(server, models) {
350
359
  // src/tools/evaluate.ts
351
360
  import { z as z4 } from "zod";
352
361
  import { hydrateRules } from "@run-iq/core";
353
- function registerEvaluateTool(server, engine) {
362
+ function registerEvaluateTool(server, engine, initialRules = []) {
354
363
  server.tool(
355
364
  "evaluate",
356
365
  "Evaluate Run-IQ rules against input data in dry-run mode. Returns the computed value, breakdown per rule, applied/skipped rules, and execution trace.",
@@ -370,7 +379,7 @@ function registerEvaluateTool(server, engine) {
370
379
  },
371
380
  async (args) => {
372
381
  try {
373
- const rules = hydrateRules(args.rules);
382
+ const rules = hydrateRules([...initialRules, ...args.rules || []]);
374
383
  const input = {
375
384
  data: args.input.data,
376
385
  requestId: args.input.requestId,
@@ -419,15 +428,25 @@ function registerEvaluateTool(server, engine) {
419
428
  // src/tools/inspect-rule.ts
420
429
  import { createHash as createHash4 } from "crypto";
421
430
  import { z as z5 } from "zod";
422
- function registerInspectRuleTool(server, models, descriptors) {
431
+ function registerInspectRuleTool(server, models, descriptors, initialRules = []) {
423
432
  server.tool(
424
433
  "inspect_rule",
425
434
  "Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.",
426
435
  {
427
- rule: z5.record(z5.unknown()).describe("A single Rule JSON object to inspect")
436
+ rule: z5.record(z5.unknown()).optional().describe("A single Rule JSON object to inspect"),
437
+ ruleId: z5.string().optional().describe("ID of a pre-loaded rule to inspect")
428
438
  },
429
439
  (args) => {
430
- const rule = args.rule;
440
+ let rule = args.rule;
441
+ if (args.ruleId && !rule) {
442
+ rule = initialRules.find((r) => r.id === args.ruleId);
443
+ }
444
+ if (!rule) {
445
+ return {
446
+ content: [{ type: "text", text: JSON.stringify({ error: 'Rule not found. Provide either "rule" object or "ruleId" of a pre-loaded rule.' }) }],
447
+ isError: true
448
+ };
449
+ }
431
450
  const id = typeof rule["id"] === "string" ? rule["id"] : "unknown";
432
451
  const modelName = typeof rule["model"] === "string" ? rule["model"] : "";
433
452
  const params = rule["params"];
@@ -573,7 +592,7 @@ var ScenarioSchema = z7.object({
573
592
  })
574
593
  })
575
594
  });
576
- function registerSimulateTool(server, engine) {
595
+ function registerSimulateTool(server, engine, initialRules = []) {
577
596
  server.tool(
578
597
  "simulate",
579
598
  "Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.",
@@ -583,7 +602,7 @@ function registerSimulateTool(server, engine) {
583
602
  },
584
603
  async (args) => {
585
604
  try {
586
- const rules = hydrateRules2(args.rules);
605
+ const rules = hydrateRules2([...initialRules, ...args.rules || []]);
587
606
  const results = [];
588
607
  for (const scenario of args.scenarios) {
589
608
  const input = {
@@ -1088,7 +1107,7 @@ ${args.question}`
1088
1107
  // package.json
1089
1108
  var package_default = {
1090
1109
  name: "@run-iq/mcp-server",
1091
- version: "0.1.8",
1110
+ version: "0.1.9",
1092
1111
  description: "MCP server exposing the PPE engine to LLMs via stdio",
1093
1112
  type: "module",
1094
1113
  main: "./dist/index.js",
@@ -1151,6 +1170,7 @@ var VERSION = package_default.version;
1151
1170
  async function main() {
1152
1171
  try {
1153
1172
  let pluginsDir;
1173
+ let rulesPath;
1154
1174
  const npmPlugins = [];
1155
1175
  const argv = process.argv.slice(2);
1156
1176
  for (let i = 0; i < argv.length; i++) {
@@ -1160,9 +1180,13 @@ async function main() {
1160
1180
  } else if (argv[i] === "--plugin" && argv[i + 1]) {
1161
1181
  npmPlugins.push(argv[i + 1]);
1162
1182
  i++;
1183
+ } else if (argv[i] === "--rules" && argv[i + 1]) {
1184
+ rulesPath = argv[i + 1];
1185
+ i++;
1163
1186
  }
1164
1187
  }
1165
1188
  const bundles = [];
1189
+ const initialRules = [];
1166
1190
  if (pluginsDir) {
1167
1191
  const dirBundles = await loadPluginsFromDir(pluginsDir);
1168
1192
  bundles.push(...dirBundles);
@@ -1173,6 +1197,19 @@ async function main() {
1173
1197
  }
1174
1198
  const { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);
1175
1199
  const descriptors = descriptorRegistry.getAll();
1200
+ if (rulesPath) {
1201
+ try {
1202
+ const fullPath = path2.resolve(process.cwd(), rulesPath);
1203
+ const rulesContent = await fs.readFile(fullPath, "utf-8");
1204
+ const loadedRules = JSON.parse(rulesContent);
1205
+ if (Array.isArray(loadedRules)) {
1206
+ initialRules.push(...loadedRules);
1207
+ console.error(`[MCP] Pre-loaded ${initialRules.length} rules from: ${rulesPath}`);
1208
+ }
1209
+ } catch (err) {
1210
+ console.error(`[MCP] Failed to pre-load rules from "${rulesPath}":`, err instanceof Error ? err.message : err);
1211
+ }
1212
+ }
1176
1213
  const server = new McpServer(
1177
1214
  {
1178
1215
  name: "@run-iq/mcp-server",
@@ -1188,12 +1225,12 @@ async function main() {
1188
1225
  );
1189
1226
  registerCreateChecksumTool(server);
1190
1227
  registerCreateRuleTool(server, descriptors);
1191
- registerValidateRulesTool(server, models, descriptors);
1228
+ registerValidateRulesTool(server, models, descriptors, initialRules);
1192
1229
  registerListModelsTool(server, models);
1193
- registerEvaluateTool(server, engine);
1194
- registerInspectRuleTool(server, models, descriptors);
1230
+ registerEvaluateTool(server, engine, initialRules);
1231
+ registerInspectRuleTool(server, models, descriptors, initialRules);
1195
1232
  registerExplainResultTool(server);
1196
- registerSimulateTool(server, engine);
1233
+ registerSimulateTool(server, engine, initialRules);
1197
1234
  registerModelsResource(server, models);
1198
1235
  registerPluginsResource(server, plugins, dsls, descriptorRegistry);
1199
1236
  registerSchemaResource(server, models, descriptorRegistry);
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 fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createEngine } from './engine.js';\nimport { loadPluginsFromDir, loadNpmPlugins } from './loader/plugin-loader.js';\nimport { registerCreateChecksumTool } from './tools/create-checksum.js';\nimport { registerCreateRuleTool } from './tools/create-rule.js';\nimport { registerValidateRulesTool } from './tools/validate.js';\nimport { registerListModelsTool } from './tools/list-models.js';\nimport { registerEvaluateTool } from './tools/evaluate.js';\nimport { registerInspectRuleTool } from './tools/inspect-rule.js';\nimport { registerExplainResultTool } from './tools/explain.js';\nimport { registerSimulateTool } from './tools/simulate.js';\nimport { registerModelsResource } from './resources/models.js';\nimport { registerPluginsResource } from './resources/plugins.js';\nimport { registerSchemaResource } from './resources/schema.js';\nimport { registerAnalyzeTextPrompt } from './prompts/analyze-text.js';\nimport { registerDomainExpertPrompt } from './prompts/domain-expert.js';\nimport { VERSION } from './utils/version.js';\n\nasync function main() {\n try {\n let pluginsDir: string | undefined;\n let rulesPath: string | undefined;\n const npmPlugins: string[] = [];\n const argv = process.argv.slice(2);\n for (let i = 0; i < argv.length; i++) {\n if (argv[i] === '--plugins-dir' && argv[i + 1]) {\n pluginsDir = argv[i + 1];\n i++;\n } else if (argv[i] === '--plugin' && argv[i + 1]) {\n npmPlugins.push(argv[i + 1]!);\n i++;\n } else if (argv[i] === '--rules' && argv[i + 1]) {\n rulesPath = argv[i + 1];\n i++;\n }\n }\n\n // Load plugin bundles\n const bundles: PluginBundle[] = [];\n const initialRules: any[] = [];\n if (pluginsDir) {\n const dirBundles = await loadPluginsFromDir(pluginsDir);\n bundles.push(...dirBundles);\n }\n if (npmPlugins.length > 0) {\n const npmBundles = await loadNpmPlugins(npmPlugins);\n bundles.push(...npmBundles);\n }\n\n const { engine, models, descriptorRegistry, plugins, dsls } = createEngine(bundles);\n const descriptors = descriptorRegistry.getAll();\n\n // Pre-load rules if --rules is provided\n if (rulesPath) {\n try {\n const fullPath = path.resolve(process.cwd(), rulesPath);\n const rulesContent = await fs.readFile(fullPath, 'utf-8');\n const loadedRules = JSON.parse(rulesContent);\n if (Array.isArray(loadedRules)) {\n initialRules.push(...loadedRules);\n console.error(`[MCP] Pre-loaded ${initialRules.length} rules from: ${rulesPath}`);\n }\n } catch (err) {\n console.error(`[MCP] Failed to pre-load rules from \"${rulesPath}\":`, err instanceof Error ? err.message : err);\n }\n }\n\n const server = new McpServer(\n {\n name: '@run-iq/mcp-server',\n version: VERSION,\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\n },\n },\n );\n\n // Tools\n registerCreateChecksumTool(server);\n registerCreateRuleTool(server, descriptors);\n registerValidateRulesTool(server, models, descriptors, initialRules);\n registerListModelsTool(server, models);\n registerEvaluateTool(server, engine, initialRules);\n registerInspectRuleTool(server, models, descriptors, initialRules);\n registerExplainResultTool(server);\n registerSimulateTool(server, engine, initialRules);\n\n // Resources\n registerModelsResource(server, models);\n registerPluginsResource(server, plugins, dsls, descriptorRegistry);\n registerSchemaResource(server, models, descriptorRegistry);\n\n // Prompts\n registerAnalyzeTextPrompt(server, models, descriptorRegistry);\n registerDomainExpertPrompt(server, descriptorRegistry);\n\n // Start stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log successful boot to stderr\n console.error(`[MCP] Server v${VERSION} started successfully with ${bundles.length} plugins.`);\n \n } catch (error) {\n console.error('[MCP] Fatal error during startup:', error);\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error('[MCP] Unhandled promise rejection during startup:', err);\n process.exit(1);\n});\n","import { PPEEngine } from '@run-iq/core';\nimport type { PPEPlugin, DSLEvaluator, CalculationModel } from '@run-iq/core';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\nimport { DescriptorRegistry } from './descriptors/registry.js';\n\nexport interface EngineContext {\n readonly engine: PPEEngine;\n readonly models: ReadonlyMap<string, CalculationModel>;\n readonly descriptorRegistry: DescriptorRegistry;\n readonly plugins: readonly PPEPlugin[];\n readonly dsls: readonly DSLEvaluator[];\n}\n\nexport function createEngine(bundles?: readonly PluginBundle[]): EngineContext {\n const descriptorRegistry = new DescriptorRegistry();\n const allPlugins: PPEPlugin[] = [];\n const allDsls: DSLEvaluator[] = [];\n\n if (bundles && bundles.length > 0) {\n for (const bundle of bundles) {\n allPlugins.push(bundle.plugin);\n descriptorRegistry.register(bundle.descriptor);\n if (bundle.dsls) {\n allDsls.push(...bundle.dsls);\n }\n }\n }\n\n const engine = new PPEEngine({\n plugins: allPlugins,\n dsls: allDsls,\n dryRun: true,\n strict: false,\n onConflict: 'first',\n onChecksumMismatch: 'skip',\n });\n\n // Build model map from plugins that expose a models property (BasePlugin pattern)\n const models = new Map<string, CalculationModel>();\n for (const plugin of allPlugins) {\n const pluginWithModels = plugin as { models?: CalculationModel[] };\n if (Array.isArray(pluginWithModels.models)) {\n for (const model of pluginWithModels.models) {\n models.set(model.name, model);\n }\n }\n }\n\n return { engine, models, descriptorRegistry, plugins: allPlugins, dsls: allDsls };\n}\n","import type {\n PluginDescriptor,\n RuleFieldDescriptor,\n InputFieldDescriptor,\n RuleExample,\n} from '@run-iq/plugin-sdk';\n\nexport class DescriptorRegistry {\n private readonly descriptors: PluginDescriptor[] = [];\n\n register(descriptor: PluginDescriptor): void {\n this.descriptors.push(descriptor);\n }\n\n getAll(): readonly PluginDescriptor[] {\n return this.descriptors;\n }\n\n getRuleExtensions(): readonly RuleFieldDescriptor[] {\n return this.descriptors.flatMap((d) => d.ruleExtensions);\n }\n\n getInputFields(): readonly InputFieldDescriptor[] {\n const seen = new Set<string>();\n const fields: InputFieldDescriptor[] = [];\n for (const d of this.descriptors) {\n for (const f of d.inputFields) {\n if (!seen.has(f.name)) {\n seen.add(f.name);\n fields.push(f);\n }\n }\n }\n return fields;\n }\n\n getExamples(): readonly RuleExample[] {\n return this.descriptors.flatMap((d) => d.examples);\n }\n\n isEmpty(): boolean {\n return this.descriptors.length === 0;\n }\n}\n","import { readdir } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { createRequire } from 'node:module';\nimport type { PluginBundle } from '@run-iq/plugin-sdk';\n\nconst require = createRequire(import.meta.url);\n\nexport async function loadPluginsFromDir(dir: string): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n const absoluteDir = resolve(dir);\n const entries = await readdir(absoluteDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n if (!entry.name.endsWith('.js') && !entry.name.endsWith('.mjs')) continue;\n\n const filePath = resolve(absoluteDir, entry.name);\n const mod: Record<string, unknown> = await import(filePath);\n\n const bundle = (mod['default'] ?? mod) as Record<string, unknown>;\n\n if (\n bundle['plugin'] &&\n typeof bundle['plugin'] === 'object' &&\n bundle['descriptor'] &&\n typeof bundle['descriptor'] === 'object'\n ) {\n bundles.push(bundle as unknown as PluginBundle);\n }\n }\n\n return bundles;\n}\n\nexport async function loadNpmPlugins(packageNames: string[]): Promise<PluginBundle[]> {\n const bundles: PluginBundle[] = [];\n\n for (const pkgName of packageNames) {\n try {\n let resolvedPath: string;\n \n // If it looks like a local path, resolve it relative to CWD\n if (pkgName.startsWith('.') || pkgName.startsWith('/') || pkgName.includes(':')) {\n resolvedPath = path.resolve(process.cwd(), pkgName);\n } else {\n // Otherwise treat as an NPM package name\n resolvedPath = require.resolve(pkgName, { paths: [process.cwd()] });\n }\n\n const mod = await import(pathToFileURL(resolvedPath).href);\n\n // Handle various export patterns (ESM default, CJS module.exports, or named 'bundle')\n const bundle = (mod['default'] ?? mod['bundle'] ?? mod) as Record<string, unknown>;\n\n if (bundle && typeof bundle === 'object' && bundle['plugin'] && bundle['descriptor']) {\n bundles.push(bundle as unknown as PluginBundle);\n } else {\n // eslint-disable-next-line no-console\n console.error(\n `[MCP] Invalid PluginBundle exported by \"${pkgName}\". Expected { plugin, descriptor }. Found keys: ${Object.keys(bundle)}`,\n );\n }\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[MCP] Failed to load plugin \"${pkgName}\":`, err instanceof Error ? err.message : err);\n }\n }\n\n return bundles;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport function registerCreateChecksumTool(server: McpServer): void {\n server.tool(\n 'create_checksum',\n 'Compute the SHA-256 checksum of a params object. Used to generate the checksum field for Run-IQ rules.',\n { params: z.record(z.unknown()).describe('The params object to hash') },\n (args) => {\n const checksum = createHash('sha256').update(JSON.stringify(args.params)).digest('hex');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ checksum }, null, 2) }],\n };\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildCreateRuleSchema } from './schema-builder.js';\n\nexport function registerCreateRuleTool(\n server: McpServer,\n descriptors: readonly PluginDescriptor[],\n): void {\n const schema = buildCreateRuleSchema(descriptors);\n\n // Collect plugin extension field names\n const extensionFields = descriptors.flatMap((d) => d.ruleExtensions.map((f) => f.name));\n\n server.tool(\n 'create_rule',\n 'Generate a valid Run-IQ Rule JSON object with auto-computed SHA-256 checksum. Includes plugin-specific fields based on loaded plugins.',\n schema,\n (args: Record<string, unknown>) => {\n const params = args['params'] as Record<string, unknown>;\n const checksum = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n\n const rule: Record<string, unknown> = {\n id: args['id'],\n version: 1,\n model: args['model'],\n params,\n priority: (args['priority'] as number | undefined) ?? 1000,\n effectiveFrom: args['effectiveFrom'],\n effectiveUntil: args['effectiveUntil'] ?? null,\n tags: (args['tags'] as string[] | undefined) ?? [],\n checksum,\n };\n\n if (args['condition']) {\n rule['condition'] = args['condition'];\n }\n\n // Add plugin extension fields\n for (const field of extensionFields) {\n if (args[field] !== undefined) {\n rule[field] = args[field];\n }\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ rule }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { RuleFieldDescriptor, PluginDescriptor } from '@run-iq/plugin-sdk';\n\nfunction buildFieldSchema(field: RuleFieldDescriptor): z.ZodTypeAny {\n let schema: z.ZodTypeAny;\n\n if (field.enum && field.enum.length > 0) {\n schema = z.enum(field.enum as [string, ...string[]]);\n } else {\n switch (field.type) {\n case 'string':\n schema = z.string();\n break;\n case 'number':\n schema = z.number();\n break;\n case 'boolean':\n schema = z.boolean();\n break;\n }\n }\n\n if (!field.required) {\n schema = schema.optional();\n }\n\n return schema.describe(field.description);\n}\n\nexport function buildCreateRuleSchema(\n descriptors: readonly PluginDescriptor[],\n): Record<string, z.ZodTypeAny> {\n const shape: Record<string, z.ZodTypeAny> = {\n id: z.string().describe('Unique rule identifier'),\n model: z.string().describe('Calculation model name (e.g. FLAT_RATE, PROGRESSIVE_BRACKET)'),\n params: z.record(z.unknown()).describe('Model-specific parameters'),\n priority: z\n .number()\n .int()\n .optional()\n .describe('Rule priority (may be auto-computed by plugins, e.g. from jurisdiction+scope)'),\n effectiveFrom: z.string().describe('ISO 8601 date string for when the rule becomes active'),\n effectiveUntil: z\n .string()\n .nullable()\n .optional()\n .describe('ISO 8601 date string for when the rule expires (null = no expiry)'),\n tags: z.array(z.string()).optional().describe('Optional tags for filtering'),\n condition: z\n .object({\n dsl: z.string().describe('DSL identifier (e.g. \"jsonlogic\")'),\n value: z.unknown().describe('DSL-specific condition expression'),\n })\n .optional()\n .describe('Optional condition expression'),\n };\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n shape[field.name] = buildFieldSchema(field);\n }\n }\n\n return shape;\n}\n\nexport function buildValidateExtensionErrors(\n rule: Record<string, unknown>,\n descriptors: readonly PluginDescriptor[],\n): string[] {\n const errors: string[] = [];\n\n for (const descriptor of descriptors) {\n for (const field of descriptor.ruleExtensions) {\n const value = rule[field.name];\n\n if (field.required && (value === undefined || value === null)) {\n errors.push(`\"${field.name}\" is required by ${descriptor.name}: ${field.description}`);\n continue;\n }\n\n if (value === undefined || value === null) continue;\n\n if (field.enum && !field.enum.includes(String(value))) {\n errors.push(\n `\"${field.name}\" must be one of: ${field.enum.join(', ')} (got \"${String(value)}\")`,\n );\n }\n\n if (field.type === 'string' && typeof value !== 'string') {\n errors.push(`\"${field.name}\" must be a string`);\n }\n if (field.type === 'number' && typeof value !== 'number') {\n errors.push(`\"${field.name}\" must be a number`);\n }\n if (field.type === 'boolean' && typeof value !== 'boolean') {\n errors.push(`\"${field.name}\" must be a boolean`);\n }\n }\n }\n\n return errors;\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nconst RuleSchema = z.object({\n id: z.string(),\n version: z.number(),\n model: z.string(),\n params: z.unknown(),\n priority: z.number().optional(),\n effectiveFrom: z.string(),\n effectiveUntil: z.string().nullable(),\n tags: z.array(z.string()),\n checksum: z.string(),\n condition: z.object({ dsl: z.string(), value: z.unknown() }).optional(),\n});\n\ninterface ValidationEntry {\n ruleId: string;\n valid: boolean;\n errors?: string[];\n}\n\nexport function registerValidateRulesTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n initialRules: any[] = [],\n): void {\n server.tool(\n 'validate_rules',\n 'Validate the structure, checksum, model params, and plugin-specific fields of Run-IQ rules.',\n {\n rules: z.array(z.record(z.unknown())).optional().describe('Array of Rule JSON objects to validate'),\n },\n (args) => {\n const entries: ValidationEntry[] = [];\n const rulesToValidate = [...initialRules, ...(args.rules || [])];\n\n for (const raw of rulesToValidate) {\n const parsed = RuleSchema.safeParse(raw);\n const ruleId = typeof raw['id'] === 'string' ? raw['id'] : 'unknown';\n\n if (!parsed.success) {\n entries.push({\n ruleId,\n valid: false,\n errors: parsed.error.errors.map((e) => `${e.path.join('.')}: ${e.message}`),\n });\n continue;\n }\n\n const rule = parsed.data;\n const errors: string[] = [];\n\n // Checksum verification\n const computed = createHash('sha256').update(JSON.stringify(rule.params)).digest('hex');\n if (computed !== rule.checksum) {\n errors.push(`Checksum mismatch: expected ${computed}, got ${rule.checksum}`);\n }\n\n // Model existence\n const model = models.get(rule.model);\n if (!model) {\n errors.push(\n `Model \"${rule.model}\" not found. Available: ${[...models.keys()].join(', ')}`,\n );\n } else {\n // Param validation via model\n const validation = model.validateParams(rule.params);\n if (!validation.valid && validation.errors) {\n errors.push(...validation.errors);\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(raw, descriptors);\n errors.push(...extensionErrors);\n\n entries.push({\n ruleId: rule.id,\n valid: errors.length === 0,\n ...(errors.length > 0 ? { errors } : {}),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ entries }, null, 2) }],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\ninterface ModelInfo {\n name: string;\n version: string;\n paramsSchema: Record<string, string>;\n}\n\nexport function registerListModelsTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.tool(\n 'list_models',\n 'List all available calculation models with their parameter schemas. Shows model name, version, and expected parameters.',\n {},\n () => {\n const result: ModelInfo[] = [];\n\n for (const [, model] of models) {\n // Infer param schema from validation errors with empty object\n const validation = model.validateParams({});\n const paramsSchema: Record<string, string> = {};\n\n if (validation.errors) {\n for (const error of validation.errors) {\n // Parse error messages like '\"rate\" must be a number' or '\"base\" must be a string'\n const match = error.match(/^\"(\\w+)\"\\s+must be (?:a |an )?(.+)$/);\n if (match?.[1] && match[2]) {\n paramsSchema[match[1]] = match[2];\n }\n }\n }\n\n result.push({\n name: model.name,\n version: model.version,\n paramsSchema,\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ models: result }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nexport function registerEvaluateTool(server: McpServer, engine: PPEEngine, initialRules: any[] = []): void {\n server.tool(\n 'evaluate',\n 'Evaluate Run-IQ rules against input data in dry-run mode. Returns the computed value, breakdown per rule, applied/skipped rules, and execution trace.',\n {\n rules: z.array(z.record(z.unknown())).describe('Array of Rule JSON objects'),\n input: z\n .object({\n data: z.record(z.unknown()).describe('Input data for evaluation'),\n requestId: z.string().describe('Unique request identifier'),\n meta: z.object({\n tenantId: z.string().describe('Tenant identifier'),\n userId: z.string().optional().describe('User identifier'),\n tags: z.array(z.string()).optional().describe('Tags for rule filtering'),\n context: z.record(z.unknown()).optional().describe('Additional context'),\n effectiveDate: z\n .string()\n .optional()\n .describe('ISO 8601 date for effective date evaluation'),\n }),\n })\n .describe('Evaluation input'),\n },\n async (args) => {\n try {\n const rules = hydrateRules([...initialRules, ...(args.rules || [])]);\n\n const input = {\n data: args.input.data,\n requestId: args.input.requestId,\n meta: {\n ...args.input.meta,\n effectiveDate: args.input.meta.effectiveDate\n ? new Date(args.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n const serializable = {\n value: result.value,\n breakdown: result.breakdown,\n appliedRules: result.appliedRules.map((r) => ({\n id: r.id,\n model: r.model,\n priority: r.priority,\n })),\n skippedRules: result.skippedRules.map((s) => ({\n ruleId: s.rule.id,\n reason: s.reason,\n })),\n trace: {\n steps: result.trace.steps.map((s) => ({\n ruleId: s.ruleId,\n modelUsed: s.modelUsed,\n contribution: s.contribution,\n durationMs: s.durationMs,\n })),\n totalDurationMs: result.trace.totalDurationMs,\n },\n };\n\n return {\n content: [{ type: 'text', text: JSON.stringify(serializable, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { createHash } from 'node:crypto';\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { PluginDescriptor } from '@run-iq/plugin-sdk';\nimport { buildValidateExtensionErrors } from './schema-builder.js';\n\nexport function registerInspectRuleTool(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n descriptors: readonly PluginDescriptor[],\n initialRules: any[] = [],\n): void {\n server.tool(\n 'inspect_rule',\n 'Analyze a single Run-IQ rule in detail: checksum, model, active dates, params, and plugin-specific fields.',\n {\n rule: z.record(z.unknown()).optional().describe('A single Rule JSON object to inspect'),\n ruleId: z.string().optional().describe('ID of a pre-loaded rule to inspect'),\n },\n (args) => {\n let rule = args.rule;\n\n // If ruleId provided, find it in initialRules\n if (args.ruleId && !rule) {\n rule = initialRules.find((r) => r.id === args.ruleId);\n }\n\n if (!rule) {\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: 'Rule not found. Provide either \"rule\" object or \"ruleId\" of a pre-loaded rule.' }) }],\n isError: true,\n };\n }\n\n const id = typeof rule['id'] === 'string' ? rule['id'] : 'unknown';\n const modelName = typeof rule['model'] === 'string' ? rule['model'] : '';\n const params = rule['params'];\n const checksum = typeof rule['checksum'] === 'string' ? rule['checksum'] : '';\n\n // Checksum match\n const computed = createHash('sha256').update(JSON.stringify(params)).digest('hex');\n const checksumMatch = computed === checksum;\n\n // Model found\n const model = models.get(modelName);\n const modelFound = model !== undefined;\n\n // Param validation\n let paramErrors: string[] | undefined;\n if (model) {\n const validation = model.validateParams(params);\n if (!validation.valid && validation.errors) {\n paramErrors = [...validation.errors];\n }\n }\n\n // Plugin extension validation\n const extensionErrors = buildValidateExtensionErrors(rule, descriptors);\n\n // Active date check\n const now = new Date();\n const effectiveFrom =\n typeof rule['effectiveFrom'] === 'string' ? new Date(rule['effectiveFrom']) : null;\n const effectiveUntil =\n typeof rule['effectiveUntil'] === 'string' ? new Date(rule['effectiveUntil']) : null;\n\n const isActive =\n effectiveFrom !== null &&\n effectiveFrom <= now &&\n (effectiveUntil === null || effectiveUntil > now);\n\n const effectivePeriod = {\n from: effectiveFrom?.toISOString() ?? null,\n until: effectiveUntil?.toISOString() ?? null,\n };\n\n const allErrors = [...(paramErrors ?? []), ...extensionErrors];\n const valid = checksumMatch && modelFound && allErrors.length === 0 && isActive;\n\n const result: Record<string, unknown> = {\n ruleId: id,\n valid,\n checksumMatch,\n modelFound,\n isActive,\n effectivePeriod,\n };\n\n if (paramErrors && paramErrors.length > 0) {\n result['paramErrors'] = paramErrors;\n }\n if (extensionErrors.length > 0) {\n result['extensionErrors'] = extensionErrors;\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nconst EvaluationResultSchema = {\n result: z\n .object({\n value: z.unknown(),\n breakdown: z.array(\n z.object({\n ruleId: z.string(),\n contribution: z.unknown(),\n modelUsed: z.string(),\n label: z.string().optional(),\n }),\n ),\n appliedRules: z.array(\n z.object({\n id: z.string(),\n model: z.string(),\n priority: z.number(),\n }),\n ),\n skippedRules: z.array(\n z.object({\n ruleId: z.string(),\n reason: z.string(),\n }),\n ),\n trace: z\n .object({\n totalDurationMs: z.number(),\n steps: z.array(z.record(z.unknown())).optional(),\n })\n .optional(),\n })\n .describe('An EvaluationResult (or simplified result from the evaluate tool)'),\n};\n\nexport function registerExplainResultTool(server: McpServer): void {\n server.tool(\n 'explain_result',\n 'Generate a human-readable explanation of an evaluation result. Summarizes the total value, applied rules with their contributions, skipped rules with reasons, and execution timing.',\n EvaluationResultSchema,\n (args) => {\n const { result } = args;\n const lines: string[] = [];\n\n lines.push(`## Evaluation Result Summary`);\n lines.push('');\n lines.push(`**Total Value**: ${String(result.value)}`);\n lines.push('');\n\n // Applied rules\n if (result.appliedRules.length > 0) {\n lines.push(`### Applied Rules (${result.appliedRules.length})`);\n lines.push('');\n\n for (const applied of result.appliedRules) {\n const breakdown = result.breakdown.find((b) => b.ruleId === applied.id);\n const contribution = breakdown ? String(breakdown.contribution) : 'N/A';\n const label = breakdown?.label ? ` (${breakdown.label})` : '';\n\n lines.push(\n `- **${applied.id}**${label}: model=${applied.model}, priority=${applied.priority}, contribution=${contribution}`,\n );\n }\n lines.push('');\n } else {\n lines.push('### No rules were applied.');\n lines.push('');\n }\n\n // Skipped rules\n if (result.skippedRules.length > 0) {\n lines.push(`### Skipped Rules (${result.skippedRules.length})`);\n lines.push('');\n\n for (const skipped of result.skippedRules) {\n lines.push(`- **${skipped.ruleId}**: ${skipped.reason}`);\n }\n lines.push('');\n }\n\n // Timing\n if (result.trace?.totalDurationMs !== undefined) {\n lines.push(`### Timing`);\n lines.push('');\n lines.push(`Total duration: ${result.trace.totalDurationMs}ms`);\n }\n\n const explanation = lines.join('\\n');\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ explanation }, null, 2) }],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEEngine } from '@run-iq/core';\nimport { hydrateRules } from '@run-iq/core';\n\nconst ScenarioSchema = z.object({\n label: z.string().describe('Human-readable scenario label'),\n input: z.object({\n data: z.record(z.unknown()),\n requestId: z.string(),\n meta: z.object({\n tenantId: z.string(),\n userId: z.string().optional(),\n tags: z.array(z.string()).optional(),\n context: z.record(z.unknown()).optional(),\n effectiveDate: z.string().optional(),\n }),\n }),\n});\n\nexport function registerSimulateTool(server: McpServer, engine: PPEEngine, initialRules: any[] = []): void {\n server.tool(\n 'simulate',\n 'Compare N scenarios using the same rules. Evaluates each scenario independently and returns side-by-side results for comparison.',\n {\n rules: z\n .array(z.record(z.unknown()))\n .describe('Array of Rule JSON objects (shared across all scenarios)'),\n scenarios: z.array(ScenarioSchema).min(1).describe('Array of scenarios to compare'),\n },\n async (args) => {\n try {\n const rules = hydrateRules([...initialRules, ...(args.rules || [])]);\n\n const results = [];\n for (const scenario of args.scenarios) {\n const input = {\n data: scenario.input.data,\n requestId: scenario.input.requestId,\n meta: {\n ...scenario.input.meta,\n effectiveDate: scenario.input.meta.effectiveDate\n ? new Date(scenario.input.meta.effectiveDate)\n : undefined,\n },\n };\n\n const result = await engine.evaluate(rules, input);\n\n results.push({\n label: scenario.label,\n value: result.value,\n appliedCount: result.appliedRules.length,\n skippedCount: result.skippedRules.length,\n breakdown: result.breakdown.map((b) => ({\n ruleId: b.ruleId,\n contribution: b.contribution,\n modelUsed: b.modelUsed,\n })),\n });\n }\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ results }, null, 2) }],\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: JSON.stringify({ error: message }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\n\nfunction buildModelsCatalog(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`## ${model.name} (v${model.version})`);\n lines.push('');\n\n // Infer params from validation errors\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('### Parameters');\n lines.push('');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n lines.push('');\n }\n\n // Model-specific documentation\n switch (model.name) {\n case 'FLAT_RATE':\n lines.push('Applies a flat rate to a base value: `base_value * rate`.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.18, \"base\": \"revenue\" }`');\n lines.push('**Use case**: TVA, flat tax rates.');\n break;\n case 'PROGRESSIVE_BRACKET':\n lines.push(\n 'Applies progressive tax brackets cumulatively. Each bracket taxes only the portion within its range.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"income\", \"brackets\": [{ \"from\": 0, \"to\": 500000, \"rate\": 0 }, { \"from\": 500000, \"to\": 1000000, \"rate\": 0.1 }] }`',\n );\n lines.push('**Use case**: IRPP (income tax), progressive taxes.');\n break;\n case 'MINIMUM_TAX':\n lines.push('Computes `MAX(base_value * rate, minimum)`. Ensures a minimum tax amount.');\n lines.push('');\n lines.push('**Example params**: `{ \"rate\": 0.01, \"base\": \"revenue\", \"minimum\": 50000 }`');\n lines.push('**Use case**: Minimum corporate tax.');\n break;\n case 'THRESHOLD_BASED':\n lines.push(\n 'Applies a rate only when the base value exceeds a threshold. If `above_only` is true, taxes only the amount above the threshold.',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"base\": \"revenue\", \"threshold\": 1000000, \"rate\": 0.05, \"above_only\": true }`',\n );\n lines.push('**Use case**: Luxury tax, excess profit tax.');\n break;\n case 'FIXED_AMOUNT':\n lines.push('Returns a fixed amount regardless of input values.');\n lines.push('');\n lines.push('**Example params**: `{ \"amount\": 25000, \"currency\": \"XOF\" }`');\n lines.push('**Use case**: Fixed registration fees, stamps.');\n break;\n case 'COMPOSITE':\n lines.push(\n 'Combines multiple sub-models using an aggregation function (SUM, MAX, or MIN).',\n );\n lines.push('');\n lines.push(\n '**Example params**: `{ \"steps\": [{ \"model\": \"FLAT_RATE\", \"params\": { \"rate\": 0.18, \"base\": \"revenue\" } }], \"aggregation\": \"SUM\" }`',\n );\n lines.push('**Use case**: Complex tax calculations combining multiple methods.');\n break;\n }\n\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport function registerModelsResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n): void {\n server.resource(\n 'models-catalog',\n 'models://catalog',\n {\n description:\n 'Documentation of all available calculation models with parameter schemas and usage examples',\n },\n () => {\n const catalog = buildModelsCatalog(models);\n return {\n contents: [\n {\n uri: 'models://catalog',\n mimeType: 'text/markdown',\n text: catalog,\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { PPEPlugin, DSLEvaluator } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nexport function registerPluginsResource(\n server: McpServer,\n plugins: readonly PPEPlugin[],\n dsls: readonly DSLEvaluator[],\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'plugins-loaded',\n 'plugins://loaded',\n { description: 'Information about loaded plugins, DSL evaluators, and their descriptors' },\n () => {\n const descriptors = registry.getAll();\n\n const info = {\n plugins: plugins.map((p) => {\n const desc = descriptors.find((d) => d.name === p.name);\n const pluginWithModels = p as { models?: { name: string }[] };\n return {\n name: p.name,\n version: p.version,\n models: Array.isArray(pluginWithModels.models)\n ? pluginWithModels.models.map((m) => m.name)\n : [],\n hasDescriptor: desc !== undefined,\n ruleExtensions: desc?.ruleExtensions.map((f) => f.name) ?? [],\n };\n }),\n dsls: dsls.map((d) => ({\n name: d.dsl,\n version: d.version,\n })),\n };\n\n return {\n contents: [\n {\n uri: 'plugins://loaded',\n mimeType: 'application/json',\n text: JSON.stringify(info, null, 2),\n },\n ],\n };\n },\n );\n}\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildSchemaDocument(\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): string {\n const lines: string[] = [];\n\n lines.push('# Run-IQ Rule Schema');\n lines.push('');\n lines.push('Complete schema for creating valid rules with the currently loaded plugins.');\n lines.push('');\n\n // Base Rule fields\n lines.push('## Base Rule Fields (always required)');\n lines.push('');\n lines.push('| Field | Type | Required | Description |');\n lines.push('|-------|------|----------|-------------|');\n lines.push('| id | string | yes | Unique rule identifier |');\n lines.push('| version | number | auto (=1) | Rule version |');\n lines.push('| model | string | yes | Calculation model name |');\n lines.push('| params | object | yes | Model-specific parameters |');\n lines.push(\n '| priority | number | optional | Auto-computed by plugins (e.g. jurisdiction+scope) |',\n );\n lines.push('| effectiveFrom | string | yes | ISO 8601 date |');\n lines.push('| effectiveUntil | string\\\\|null | optional | ISO 8601 date or null |');\n lines.push('| tags | string[] | optional | Filtering tags |');\n lines.push('| checksum | string | auto | SHA-256 of params (auto-computed by create_rule) |');\n lines.push('| condition | {dsl,value} | optional | DSL condition (e.g. jsonlogic) |');\n lines.push('');\n\n // Plugin extension fields\n const descriptors = registry.getAll();\n if (descriptors.length > 0) {\n lines.push('## Plugin Extension Fields');\n lines.push('');\n\n for (const desc of descriptors) {\n lines.push(`### ${desc.name} (v${desc.version})`);\n lines.push('');\n lines.push(desc.description);\n lines.push('');\n lines.push('| Field | Type | Required | Values | Description |');\n lines.push('|-------|------|----------|--------|-------------|');\n\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? field.enum.join(', ') : '-';\n lines.push(\n `| ${field.name} | ${field.type} | ${field.required ? 'yes' : 'no'} | ${values} | ${field.description} |`,\n );\n }\n lines.push('');\n }\n }\n\n // Available models + params\n lines.push('## Available Calculation Models');\n lines.push('');\n\n for (const [, model] of models) {\n lines.push(`### ${model.name} (v${model.version})`);\n lines.push('');\n\n const validation = model.validateParams({});\n if (validation.errors) {\n lines.push('**Required params:**');\n for (const error of validation.errors) {\n lines.push(`- ${error}`);\n }\n }\n lines.push('');\n }\n\n // Input data fields\n const inputFields = registry.getInputFields();\n if (inputFields.length > 0) {\n lines.push('## Input Data Fields (input.data)');\n lines.push('');\n lines.push('Variables available for use in JSONLogic conditions (`{\"var\": \"fieldName\"}`)');\n lines.push('and as `base` parameter in calculation models.');\n lines.push('');\n lines.push('| Field | Type | Description | Examples |');\n lines.push('|-------|------|-------------|----------|');\n\n for (const field of inputFields) {\n const examples = field.examples ? field.examples.join(', ') : '-';\n lines.push(`| ${field.name} | ${field.type} | ${field.description} | ${examples} |`);\n }\n lines.push('');\n }\n\n // JSONLogic DSL reference\n lines.push('## JSONLogic Condition Syntax');\n lines.push('');\n lines.push('Conditions use the `jsonlogic` DSL. Format:');\n lines.push('```json');\n lines.push('{ \"dsl\": \"jsonlogic\", \"value\": <expression> }');\n lines.push('```');\n lines.push('');\n lines.push('**Common operators:**');\n lines.push('- `{\">=\": [{\"var\": \"revenue\"}, 1000000]}` - comparison');\n lines.push('- `{\"and\": [expr1, expr2]}` - logical AND');\n lines.push('- `{\"or\": [expr1, expr2]}` - logical OR');\n lines.push('- `{\"!\": expr}` - logical NOT');\n lines.push('- `{\"in\": [\"value\", {\"var\": \"tags\"}]}` - membership');\n lines.push('- `{\"==\": [{\"var\": \"type\"}, \"enterprise\"]}` - equality');\n lines.push('');\n\n // Examples\n const examples = registry.getExamples();\n if (examples.length > 0) {\n lines.push('## Complete Rule Examples');\n lines.push('');\n\n for (const example of examples) {\n lines.push(`### ${example.title}`);\n lines.push('');\n lines.push(example.description);\n lines.push('');\n lines.push('**Rule:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.rule, null, 2));\n lines.push('```');\n\n if (example.input) {\n lines.push('');\n lines.push('**Input data:**');\n lines.push('```json');\n lines.push(JSON.stringify(example.input, null, 2));\n lines.push('```');\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerSchemaResource(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n server.resource(\n 'rule-schema',\n 'schema://rules',\n {\n description:\n 'Complete rule schema including base fields, plugin extensions, model params, input variables, DSL syntax, and examples. THE reference for creating valid rules.',\n },\n () => ({\n contents: [\n {\n uri: 'schema://rules',\n mimeType: 'text/markdown',\n text: buildSchemaDocument(models, registry),\n },\n ],\n }),\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CalculationModel } from '@run-iq/core';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'policy';\n return descriptors.map((d) => d.domainLabel).join(' / ');\n}\n\nfunction buildModelDocs(models: ReadonlyMap<string, CalculationModel>): string {\n const lines: string[] = [];\n for (const [, model] of models) {\n const validation = model.validateParams({});\n const paramHints = validation.errors ? validation.errors.join('; ') : 'none';\n lines.push(`- **${model.name}** (v${model.version}): ${paramHints}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildExtensionDocs(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return '';\n\n const lines: string[] = [];\n for (const desc of descriptors) {\n lines.push(`\\n### Plugin: ${desc.name}`);\n lines.push(desc.description);\n lines.push('\\n**Required fields on each rule:**');\n for (const field of desc.ruleExtensions) {\n const values = field.enum ? ` (values: ${field.enum.join(', ')})` : '';\n const req = field.required ? ' [REQUIRED]' : ' [optional]';\n lines.push(`- \\`${field.name}\\`${req}: ${field.description}${values}`);\n }\n }\n return lines.join('\\n');\n}\n\nfunction buildExampleDocs(registry: DescriptorRegistry): string {\n const examples = registry.getExamples();\n if (examples.length === 0) return '';\n\n const lines: string[] = ['\\n## Concrete Examples'];\n for (const ex of examples) {\n lines.push(`\\n### ${ex.title}`);\n lines.push(ex.description);\n lines.push('```json');\n lines.push(JSON.stringify(ex.rule, null, 2));\n lines.push('```');\n }\n return lines.join('\\n');\n}\n\nfunction buildInputDocs(registry: DescriptorRegistry): string {\n const fields = registry.getInputFields();\n if (fields.length === 0) return '';\n\n const lines: string[] = ['\\n## Available input.data Fields'];\n lines.push('Use these as `{\"var\": \"fieldName\"}` in JSONLogic conditions');\n lines.push('and as `\"base\"` parameter in calculation models:\\n');\n for (const f of fields) {\n const examples = f.examples ? ` (e.g. ${f.examples.join(', ')})` : '';\n lines.push(`- \\`${f.name}\\` (${f.type}): ${f.description}${examples}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const lines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n lines.push(`\\n## ${desc.domainLabel} Guidelines`);\n for (const g of desc.promptGuidelines) {\n lines.push(`- ${g}`);\n }\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function registerAnalyzeTextPrompt(\n server: McpServer,\n models: ReadonlyMap<string, CalculationModel>,\n registry: DescriptorRegistry,\n): void {\n const domainLabel = buildDomainLabel(registry);\n\n server.prompt(\n 'analyze-text',\n `Translate a ${domainLabel} text (law, regulation, policy) into Run-IQ rule definitions. Plugin-aware: includes all required fields.`,\n {\n source_text: z\n .string()\n .describe('The regulatory, legal, or policy text to analyze and convert into rules'),\n country: z.string().optional().describe('ISO country code (e.g. TG, FR, US, IN)'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are an expert at translating regulatory and policy texts into structured Run-IQ rules.\n\n## Available Calculation Models\n${buildModelDocs(models)}\n${buildExtensionDocs(registry)}\n${buildInputDocs(registry)}\n${buildGuidelinesSection(registry)}\n\n## Rule Creation Workflow\n1. Read the source text carefully\n2. Identify each rule, rate, threshold, bracket, condition, or exemption\n3. Map each identified element to the appropriate calculation model\n4. Use the \\`create_rule\\` tool — it knows ALL required fields for loaded plugins\n5. Use the \\`validate_rules\\` tool to verify your rules are valid\n6. Read \\`schema://rules\\` for the complete field reference if needed\n\n## JSONLogic Conditions\n\\`\\`\\`json\n{ \"dsl\": \"jsonlogic\", \"value\": { \">=\": [{ \"var\": \"revenue\" }, 100000] } }\n\\`\\`\\`\n${buildExampleDocs(registry)}\n${args.country ? `\\n## Target Country: ${args.country}\\n` : ''}\n## Source Text to Analyze\n${args.source_text}`,\n },\n },\n ],\n };\n },\n );\n}\n","import { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { DescriptorRegistry } from '../descriptors/registry.js';\n\nfunction buildGuidelinesSection(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n const allGuidelines: string[] = [];\n\n for (const desc of descriptors) {\n if (desc.promptGuidelines.length > 0) {\n allGuidelines.push(`### ${desc.name} (${desc.domainLabel})`);\n for (const g of desc.promptGuidelines) {\n allGuidelines.push(`- ${g}`);\n }\n }\n }\n\n if (allGuidelines.length === 0) return '';\n return `## Domain-Specific Guidelines\\n${allGuidelines.join('\\n')}`;\n}\n\nfunction buildDomainLabel(registry: DescriptorRegistry): string {\n const descriptors = registry.getAll();\n if (descriptors.length === 0) return 'general-purpose';\n return descriptors.map((d) => d.domainLabel).join(' + ');\n}\n\nexport function registerDomainExpertPrompt(server: McpServer, registry: DescriptorRegistry): void {\n const descriptors = registry.getAll();\n const domainLabel = buildDomainLabel(registry);\n const pluginList = descriptors.map((d) => `- ${d.name}: ${d.description}`).join('\\n');\n\n server.prompt(\n 'domain-expert',\n `${domainLabel} calculation expertise: scenario comparison, result explanation, recommendations`,\n {\n question: z.string().describe('The question or scenario to analyze'),\n },\n (args) => {\n return {\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: `You are a ${domainLabel} expert assistant powered by the Run-IQ PPE (Parametric Policy Engine).\n\n## Loaded Plugins\n${pluginList || 'No plugins loaded.'}\n\n## Your Tools\n- **evaluate**: evaluate rules against input data (always dry-run)\n- **simulate**: compare N scenarios side-by-side\n- **validate_rules**: verify rule structure, checksum, and plugin-specific fields\n- **explain_result**: human-readable result explanation\n- **create_rule**: generate rules with ALL required plugin fields\n- **inspect_rule**: analyze a single rule in detail\n- **list_models**: show available calculation models\n- **create_checksum**: compute SHA-256 for params\n\n## Key Resources\n- \\`schema://rules\\` — THE complete rule schema reference\n- \\`models://catalog\\` — model documentation with examples\n- \\`plugins://loaded\\` — loaded plugins and their capabilities\n\n## General Guidelines\n1. Always read \\`schema://rules\\` before creating rules — it has ALL required fields\n2. When comparing scenarios, use the \\`simulate\\` tool with clear labels\n3. Always validate rules after creating them\n\n${buildGuidelinesSection(registry)}\n\n## Question\n${args.question}`,\n },\n },\n ],\n };\n },\n );\n}\n","{\n \"name\": \"@run-iq/mcp-server\",\n \"version\": \"0.1.9\",\n \"description\": \"MCP server exposing the PPE engine to LLMs via stdio\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"run-iq-mcp\": \"./dist/index.js\",\n \"mcp-server\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint src/ tests/ && prettier --check src/ tests/\",\n \"lint:fix\": \"eslint src/ tests/ --fix && prettier --write src/ tests/\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.27.0\",\n \"@run-iq/core\": \"^0.2.0\",\n \"@run-iq/plugin-sdk\": \"^0.2.2\",\n \"zod\": \"^3.23.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.11.0\",\n \"@typescript-eslint/eslint-plugin\": \"^7.0.0\",\n \"@typescript-eslint/parser\": \"^7.0.0\",\n \"eslint\": \"^8.57.0\",\n \"prettier\": \"^3.2.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.7.0\",\n \"vitest\": \"^3.0.0\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Run-IQ/mcp-server.git\"\n },\n \"homepage\": \"https://github.com/Run-IQ/mcp-server#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/Run-IQ/mcp-server/issues\"\n },\n \"author\": \"Abdou-Raouf ATARMLA\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=20.0.0\"\n }\n}\n","import pkg from '../../package.json' with { type: 'json' };\nexport const VERSION = pkg.version;\n"],"mappings":"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","names":["path","require","createHash","z","createHash","createHash","z","z","createHash","z","createHash","z","z","createHash","z","z","hydrateRules","examples","z","z","buildGuidelinesSection","buildDomainLabel","path"]}
package/package.json CHANGED
@@ -1,57 +1,57 @@
1
- {
2
- "name": "@run-iq/mcp-server",
3
- "version": "0.1.8",
4
- "description": "MCP server exposing the PPE engine to LLMs via stdio",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "bin": {
9
- "run-iq-mcp": "./dist/index.js",
10
- "mcp-server": "./dist/index.js"
11
- },
12
- "exports": {
13
- ".": {
14
- "types": "./dist/index.d.ts",
15
- "default": "./dist/index.js"
16
- }
17
- },
18
- "files": [
19
- "dist"
20
- ],
21
- "scripts": {
22
- "build": "tsup",
23
- "test": "vitest run",
24
- "typecheck": "tsc --noEmit",
25
- "lint": "eslint src/ tests/ && prettier --check src/ tests/",
26
- "lint:fix": "eslint src/ tests/ --fix && prettier --write src/ tests/"
27
- },
28
- "dependencies": {
29
- "@modelcontextprotocol/sdk": "^1.27.0",
30
- "@run-iq/core": "^0.2.0",
31
- "@run-iq/plugin-sdk": "^0.2.2",
32
- "zod": "^3.23.0"
33
- },
34
- "devDependencies": {
35
- "@types/node": "^20.11.0",
36
- "@typescript-eslint/eslint-plugin": "^7.0.0",
37
- "@typescript-eslint/parser": "^7.0.0",
38
- "eslint": "^8.57.0",
39
- "prettier": "^3.2.0",
40
- "tsup": "^8.0.0",
41
- "typescript": "^5.7.0",
42
- "vitest": "^3.0.0"
43
- },
44
- "repository": {
45
- "type": "git",
46
- "url": "https://github.com/Run-IQ/mcp-server.git"
47
- },
48
- "homepage": "https://github.com/Run-IQ/mcp-server#readme",
49
- "bugs": {
50
- "url": "https://github.com/Run-IQ/mcp-server/issues"
51
- },
52
- "author": "Abdou-Raouf ATARMLA",
53
- "license": "MIT",
54
- "engines": {
55
- "node": ">=20.0.0"
56
- }
57
- }
1
+ {
2
+ "name": "@run-iq/mcp-server",
3
+ "version": "0.1.9",
4
+ "description": "MCP server exposing the PPE engine to LLMs via stdio",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "run-iq-mcp": "./dist/index.js",
10
+ "mcp-server": "./dist/index.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsup",
23
+ "test": "vitest run",
24
+ "typecheck": "tsc --noEmit",
25
+ "lint": "eslint src/ tests/ && prettier --check src/ tests/",
26
+ "lint:fix": "eslint src/ tests/ --fix && prettier --write src/ tests/"
27
+ },
28
+ "dependencies": {
29
+ "@modelcontextprotocol/sdk": "^1.27.0",
30
+ "@run-iq/core": "^0.2.0",
31
+ "@run-iq/plugin-sdk": "^0.2.2",
32
+ "zod": "^3.23.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^20.11.0",
36
+ "@typescript-eslint/eslint-plugin": "^7.0.0",
37
+ "@typescript-eslint/parser": "^7.0.0",
38
+ "eslint": "^8.57.0",
39
+ "prettier": "^3.2.0",
40
+ "tsup": "^8.0.0",
41
+ "typescript": "^5.7.0",
42
+ "vitest": "^3.0.0"
43
+ },
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/Run-IQ/mcp-server.git"
47
+ },
48
+ "homepage": "https://github.com/Run-IQ/mcp-server#readme",
49
+ "bugs": {
50
+ "url": "https://github.com/Run-IQ/mcp-server/issues"
51
+ },
52
+ "author": "Abdou-Raouf ATARMLA",
53
+ "license": "MIT",
54
+ "engines": {
55
+ "node": ">=20.0.0"
56
+ }
57
+ }