@orygn/opa-mcp 0.1.4 → 0.1.5

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.
@@ -0,0 +1,226 @@
1
+ /**
2
+ * `rego_policy_diff` -- evaluate the same query against two policies and
3
+ * compare the results.
4
+ *
5
+ * Both evaluations run in parallel. The output surfaces:
6
+ * - `resultA` / `resultB`: the extracted expression value from each eval
7
+ * (undefined when the query is undefined for that policy)
8
+ * - `equal`: true when the results are structurally identical
9
+ * - `changedPaths`: dot/bracket paths where values differ, e.g.
10
+ * ["allow", "violations[0].code"]
11
+ *
12
+ * Typical use case: compare a refactored policy against the original to
13
+ * verify behavioral equivalence (or intentional divergence) for a
14
+ * representative input.
15
+ *
16
+ * Each side accepts either inline source (sourceA / sourceB) or a file /
17
+ * directory path (pathA / pathB). File paths must be within allowed roots.
18
+ */
19
+ import { z } from 'zod';
20
+ import { OpaCli } from '../../lib/opa-cli.js';
21
+ import { err, ok } from '../../lib/errors.js';
22
+ import { mapSubprocessFailure, validatePaths, withToolEnvelope } from '../../lib/tool-helpers.js';
23
+ const RegoPolicyDiffInput = {
24
+ sourceA: z
25
+ .string()
26
+ .optional()
27
+ .describe('Inline Rego source for policy A. Mutually exclusive with pathA.'),
28
+ pathA: z
29
+ .string()
30
+ .optional()
31
+ .describe('File or directory path for policy A. Must be inside an allowed root. Mutually exclusive with sourceA.'),
32
+ sourceB: z
33
+ .string()
34
+ .optional()
35
+ .describe('Inline Rego source for policy B. Mutually exclusive with pathB.'),
36
+ pathB: z
37
+ .string()
38
+ .optional()
39
+ .describe('File or directory path for policy B. Must be inside an allowed root. Mutually exclusive with sourceB.'),
40
+ query: z
41
+ .string()
42
+ .min(1)
43
+ .describe('The query to evaluate against both policies, e.g. "data.example.allow".'),
44
+ input: z
45
+ .unknown()
46
+ .optional()
47
+ .describe('Inline input document (JSON). Mutually exclusive with inputPath.'),
48
+ inputPath: z
49
+ .string()
50
+ .optional()
51
+ .describe('Path to a JSON input file. Must be inside an allowed root. Mutually exclusive with input.'),
52
+ dataPaths: z
53
+ .array(z.string())
54
+ .optional()
55
+ .describe('Additional data or policy paths loaded for both evaluations. Each must be inside an allowed root.'),
56
+ };
57
+ /**
58
+ * Extract the meaningful value from `opa eval --format=json` stdout.
59
+ *
60
+ * - Single result, single expression: returns expressions[0].value
61
+ * - Multiple result rows (iteration binding): returns the full result array
62
+ * - Empty result (`{}` or `{"result":[]}`) or parse failure: returns undefined
63
+ */
64
+ export function extractResultValue(stdout) {
65
+ const text = stdout.trim();
66
+ if (!text || text === '{}')
67
+ return undefined;
68
+ try {
69
+ const parsed = JSON.parse(text);
70
+ if (!parsed.result || parsed.result.length === 0)
71
+ return undefined;
72
+ if (parsed.result.length === 1) {
73
+ const exprs = parsed.result[0]?.expressions ?? [];
74
+ if (exprs.length === 1)
75
+ return exprs[0]?.value;
76
+ return exprs.map((e) => e?.value);
77
+ }
78
+ // Multiple result rows from iteration -- return the full result array so
79
+ // the caller can compare the complete set of solutions.
80
+ return parsed.result;
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ /**
87
+ * Return the set of dot/bracket paths where `a` and `b` differ.
88
+ *
89
+ * Rules:
90
+ * - Identical values (JSON.stringify equal): []
91
+ * - Different types, nulls, or undefined on either side: [path || '.']
92
+ * - Both arrays with different lengths: [path || '.']
93
+ * - Both arrays, same length: recurse per index using `[i]` notation
94
+ * - Both plain objects: recurse per key using dot notation
95
+ */
96
+ export function diffValues(a, b, path = '') {
97
+ if (JSON.stringify(a) === JSON.stringify(b))
98
+ return [];
99
+ const label = path || '.';
100
+ if (a === null ||
101
+ b === null ||
102
+ a === undefined ||
103
+ b === undefined ||
104
+ typeof a !== 'object' ||
105
+ typeof b !== 'object' ||
106
+ Array.isArray(a) !== Array.isArray(b)) {
107
+ return [label];
108
+ }
109
+ if (Array.isArray(a) && Array.isArray(b)) {
110
+ if (a.length !== b.length)
111
+ return [label];
112
+ const diffs = [];
113
+ for (let i = 0; i < a.length; i++) {
114
+ diffs.push(...diffValues(a[i], b[i], `${path}[${i}]`));
115
+ }
116
+ return diffs;
117
+ }
118
+ const objA = a;
119
+ const objB = b;
120
+ const keys = new Set([...Object.keys(objA), ...Object.keys(objB)]);
121
+ const diffs = [];
122
+ for (const key of keys) {
123
+ const childPath = path ? `${path}.${key}` : key;
124
+ diffs.push(...diffValues(objA[key], objB[key], childPath));
125
+ }
126
+ return diffs;
127
+ }
128
+ export function registerRegoPolicyDiff(server, config) {
129
+ const opa = new OpaCli(config);
130
+ server.registerTool('rego_policy_diff', {
131
+ title: 'Diff two Rego policies',
132
+ description: 'Evaluate the same query against two policies (or two versions of the same policy) and compare the results. Both evaluations run in parallel. Returns `equal: true/false`, the raw result from each side, and `changedPaths` -- the dot/bracket paths that differ. Useful for verifying that a refactor preserves behavior, or understanding exactly where two policies diverge. Each side takes either inline source (sourceA/sourceB) or a file/directory path (pathA/pathB). The same input and query are used for both evaluations.',
133
+ inputSchema: RegoPolicyDiffInput,
134
+ }, async ({ sourceA, pathA, sourceB, pathB, query, input, inputPath, dataPaths }) => {
135
+ return withToolEnvelope(config, async () => {
136
+ // ── Input validation ──────────────────────────────────────────────
137
+ if (sourceA === undefined && pathA === undefined) {
138
+ return err('INVALID_INPUT', 'One of sourceA or pathA is required.');
139
+ }
140
+ if (sourceA !== undefined && pathA !== undefined) {
141
+ return err('INVALID_INPUT', 'Provide either sourceA or pathA, not both.');
142
+ }
143
+ if (sourceB === undefined && pathB === undefined) {
144
+ return err('INVALID_INPUT', 'One of sourceB or pathB is required.');
145
+ }
146
+ if (sourceB !== undefined && pathB !== undefined) {
147
+ return err('INVALID_INPUT', 'Provide either sourceB or pathB, not both.');
148
+ }
149
+ if (input !== undefined && inputPath !== undefined) {
150
+ return err('INVALID_INPUT', 'Provide either input or inputPath, not both.');
151
+ }
152
+ // ── Path validation ───────────────────────────────────────────────
153
+ let resolvedPathA;
154
+ if (pathA !== undefined) {
155
+ const v = validatePaths([pathA], config, { mustExist: true });
156
+ if (!v.ok)
157
+ return v.error;
158
+ resolvedPathA = v.resolved[0];
159
+ }
160
+ let resolvedPathB;
161
+ if (pathB !== undefined) {
162
+ const v = validatePaths([pathB], config, { mustExist: true });
163
+ if (!v.ok)
164
+ return v.error;
165
+ resolvedPathB = v.resolved[0];
166
+ }
167
+ let resolvedInputPath;
168
+ if (inputPath !== undefined) {
169
+ const v = validatePaths([inputPath], config, { mustExist: true });
170
+ if (!v.ok)
171
+ return v.error;
172
+ resolvedInputPath = v.resolved[0];
173
+ }
174
+ let resolvedDataPaths = [];
175
+ if (dataPaths && dataPaths.length > 0) {
176
+ const v = validatePaths(dataPaths, config, { mustExist: true });
177
+ if (!v.ok)
178
+ return v.error;
179
+ resolvedDataPaths = v.resolved;
180
+ }
181
+ // ── Build eval inputs ─────────────────────────────────────────────
182
+ const commonOpts = {
183
+ query,
184
+ ...(input !== undefined ? { input } : {}),
185
+ ...(resolvedInputPath !== undefined ? { inputPath: resolvedInputPath } : {}),
186
+ };
187
+ const evalInputA = sourceA !== undefined
188
+ ? { ...commonOpts, source: sourceA, paths: resolvedDataPaths }
189
+ : { ...commonOpts, paths: [...resolvedDataPaths, resolvedPathA] };
190
+ const evalInputB = sourceB !== undefined
191
+ ? { ...commonOpts, source: sourceB, paths: resolvedDataPaths }
192
+ : { ...commonOpts, paths: [...resolvedDataPaths, resolvedPathB] };
193
+ // ── Run both evals in parallel ─────────────────────────────────────
194
+ const [resultA, resultB] = await Promise.all([opa.eval(evalInputA), opa.eval(evalInputB)]);
195
+ // ── Error mapping (check A first, then B) ─────────────────────────
196
+ const binaryFailure = mapSubprocessFailure(resultA, 'opa');
197
+ if (binaryFailure)
198
+ return binaryFailure;
199
+ if (resultA.exitCode !== 0) {
200
+ return err('INVALID_REGO', 'Policy A failed to evaluate.', {
201
+ details: { policy: 'A', stderr: resultA.stderr.trim(), exitCode: resultA.exitCode },
202
+ });
203
+ }
204
+ const binaryFailureB = mapSubprocessFailure(resultB, 'opa');
205
+ if (binaryFailureB)
206
+ return binaryFailureB;
207
+ if (resultB.exitCode !== 0) {
208
+ return err('INVALID_REGO', 'Policy B failed to evaluate.', {
209
+ details: { policy: 'B', stderr: resultB.stderr.trim(), exitCode: resultB.exitCode },
210
+ });
211
+ }
212
+ // ── Extract and compare ───────────────────────────────────────────
213
+ const valueA = extractResultValue(resultA.stdout);
214
+ const valueB = extractResultValue(resultB.stdout);
215
+ const changedPaths = diffValues(valueA, valueB);
216
+ return ok({
217
+ query,
218
+ equal: changedPaths.length === 0,
219
+ resultA: valueA,
220
+ resultB: valueB,
221
+ changedPaths,
222
+ });
223
+ });
224
+ });
225
+ }
226
+ //# sourceMappingURL=policy-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-diff.js","sourceRoot":"","sources":["../../../src/tools/helpers/policy-diff.ts"],"names":[],"mappings":"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"}
@@ -25,7 +25,11 @@
25
25
  * rego_describe_policy,
26
26
  * rego_suggest_fix,
27
27
  * rego_coverage_gaps,
28
- * rego_security_audit
28
+ * rego_security_audit,
29
+ * rego_infer_input_schema,
30
+ * rego_fix,
31
+ * rego_format_write,
32
+ * rego_policy_diff
29
33
  * Category F -- Meta: mcp_server_info
30
34
  */
31
35
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAOrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAiCA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAc;IAC7D,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,MAAc;IAC7D,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,6BAA6B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9C,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orygn/opa-mcp",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "mcpName": "io.github.OrygnsCode/opa-mcp",
5
5
  "description": "Model Context Protocol server for Open Policy Agent (OPA). Author, validate, debug, and explain Rego policies through any MCP-compatible client.",
6
6
  "type": "module",