@orygn/opa-mcp 0.0.0 → 0.1.1
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/CHANGELOG.md +150 -0
- package/LICENSE +21 -0
- package/README.md +622 -2
- package/dist/config.d.ts +58 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +72 -0
- package/dist/config.js.map +1 -0
- package/dist/lib/errors.d.ts +18 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +25 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/logger.d.ts +10 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +57 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/opa-cli.d.ts +226 -0
- package/dist/lib/opa-cli.d.ts.map +1 -0
- package/dist/lib/opa-cli.js +283 -0
- package/dist/lib/opa-cli.js.map +1 -0
- package/dist/lib/opa-client.d.ts +47 -0
- package/dist/lib/opa-client.d.ts.map +1 -0
- package/dist/lib/opa-client.js +101 -0
- package/dist/lib/opa-client.js.map +1 -0
- package/dist/lib/output.d.ts +17 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +21 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/regal-cli.d.ts +79 -0
- package/dist/lib/regal-cli.d.ts.map +1 -0
- package/dist/lib/regal-cli.js +122 -0
- package/dist/lib/regal-cli.js.map +1 -0
- package/dist/lib/security.d.ts +16 -0
- package/dist/lib/security.d.ts.map +1 -0
- package/dist/lib/security.js +64 -0
- package/dist/lib/security.js.map +1 -0
- package/dist/lib/subprocess.d.ts +26 -0
- package/dist/lib/subprocess.d.ts.map +1 -0
- package/dist/lib/subprocess.js +72 -0
- package/dist/lib/subprocess.js.map +1 -0
- package/dist/lib/tool-helpers.d.ts +46 -0
- package/dist/lib/tool-helpers.d.ts.map +1 -0
- package/dist/lib/tool-helpers.js +73 -0
- package/dist/lib/tool-helpers.js.map +1 -0
- package/dist/prompts/index.d.ts +4 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +147 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +12 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +107 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/patterns.d.ts +9 -0
- package/dist/resources/patterns.d.ts.map +1 -0
- package/dist/resources/patterns.js +375 -0
- package/dist/resources/patterns.js.map +1 -0
- package/dist/resources/style-guide.d.ts +6 -0
- package/dist/resources/style-guide.d.ts.map +1 -0
- package/dist/resources/style-guide.js +187 -0
- package/dist/resources/style-guide.js.map +1 -0
- package/dist/server.d.ts +34 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +125 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/authoring/capabilities.d.ts +11 -0
- package/dist/tools/authoring/capabilities.d.ts.map +1 -0
- package/dist/tools/authoring/capabilities.js +57 -0
- package/dist/tools/authoring/capabilities.js.map +1 -0
- package/dist/tools/authoring/check.d.ts +18 -0
- package/dist/tools/authoring/check.d.ts.map +1 -0
- package/dist/tools/authoring/check.js +71 -0
- package/dist/tools/authoring/check.js.map +1 -0
- package/dist/tools/authoring/deps.d.ts +8 -0
- package/dist/tools/authoring/deps.d.ts.map +1 -0
- package/dist/tools/authoring/deps.js +51 -0
- package/dist/tools/authoring/deps.js.map +1 -0
- package/dist/tools/authoring/format.d.ts +8 -0
- package/dist/tools/authoring/format.d.ts.map +1 -0
- package/dist/tools/authoring/format.js +44 -0
- package/dist/tools/authoring/format.js.map +1 -0
- package/dist/tools/authoring/index.d.ts +11 -0
- package/dist/tools/authoring/index.d.ts.map +1 -0
- package/dist/tools/authoring/index.js +17 -0
- package/dist/tools/authoring/index.js.map +1 -0
- package/dist/tools/authoring/inspect.d.ts +10 -0
- package/dist/tools/authoring/inspect.d.ts.map +1 -0
- package/dist/tools/authoring/inspect.js +47 -0
- package/dist/tools/authoring/inspect.js.map +1 -0
- package/dist/tools/authoring/lint.d.ts +18 -0
- package/dist/tools/authoring/lint.d.ts.map +1 -0
- package/dist/tools/authoring/lint.js +111 -0
- package/dist/tools/authoring/lint.js.map +1 -0
- package/dist/tools/authoring/parse.d.ts +7 -0
- package/dist/tools/authoring/parse.d.ts.map +1 -0
- package/dist/tools/authoring/parse.js +43 -0
- package/dist/tools/authoring/parse.js.map +1 -0
- package/dist/tools/bundles/build.d.ts +8 -0
- package/dist/tools/bundles/build.d.ts.map +1 -0
- package/dist/tools/bundles/build.js +87 -0
- package/dist/tools/bundles/build.js.map +1 -0
- package/dist/tools/bundles/index.d.ts +10 -0
- package/dist/tools/bundles/index.d.ts.map +1 -0
- package/dist/tools/bundles/index.js +7 -0
- package/dist/tools/bundles/index.js.map +1 -0
- package/dist/tools/bundles/sign.d.ts +8 -0
- package/dist/tools/bundles/sign.d.ts.map +1 -0
- package/dist/tools/bundles/sign.js +47 -0
- package/dist/tools/bundles/sign.js.map +1 -0
- package/dist/tools/evaluation/_shared.d.ts +55 -0
- package/dist/tools/evaluation/_shared.d.ts.map +1 -0
- package/dist/tools/evaluation/_shared.js +102 -0
- package/dist/tools/evaluation/_shared.js.map +1 -0
- package/dist/tools/evaluation/bench.d.ts +9 -0
- package/dist/tools/evaluation/bench.d.ts.map +1 -0
- package/dist/tools/evaluation/bench.js +76 -0
- package/dist/tools/evaluation/bench.js.map +1 -0
- package/dist/tools/evaluation/compile.d.ts +11 -0
- package/dist/tools/evaluation/compile.d.ts.map +1 -0
- package/dist/tools/evaluation/compile.js +19 -0
- package/dist/tools/evaluation/compile.js.map +1 -0
- package/dist/tools/evaluation/eval.d.ts +10 -0
- package/dist/tools/evaluation/eval.d.ts.map +1 -0
- package/dist/tools/evaluation/eval.js +35 -0
- package/dist/tools/evaluation/eval.js.map +1 -0
- package/dist/tools/evaluation/index.d.ts +11 -0
- package/dist/tools/evaluation/index.d.ts.map +1 -0
- package/dist/tools/evaluation/index.js +11 -0
- package/dist/tools/evaluation/index.js.map +1 -0
- package/dist/tools/evaluation/test.d.ts +28 -0
- package/dist/tools/evaluation/test.d.ts.map +1 -0
- package/dist/tools/evaluation/test.js +74 -0
- package/dist/tools/evaluation/test.js.map +1 -0
- package/dist/tools/helpers/describe-policy.d.ts +26 -0
- package/dist/tools/helpers/describe-policy.d.ts.map +1 -0
- package/dist/tools/helpers/describe-policy.js +76 -0
- package/dist/tools/helpers/describe-policy.js.map +1 -0
- package/dist/tools/helpers/explain-decision.d.ts +41 -0
- package/dist/tools/helpers/explain-decision.d.ts.map +1 -0
- package/dist/tools/helpers/explain-decision.js +75 -0
- package/dist/tools/helpers/explain-decision.js.map +1 -0
- package/dist/tools/helpers/generate-test-skeleton.d.ts +8 -0
- package/dist/tools/helpers/generate-test-skeleton.d.ts.map +1 -0
- package/dist/tools/helpers/generate-test-skeleton.js +93 -0
- package/dist/tools/helpers/generate-test-skeleton.js.map +1 -0
- package/dist/tools/helpers/index.d.ts +12 -0
- package/dist/tools/helpers/index.d.ts.map +1 -0
- package/dist/tools/helpers/index.js +11 -0
- package/dist/tools/helpers/index.js.map +1 -0
- package/dist/tools/helpers/suggest-fix.d.ts +15 -0
- package/dist/tools/helpers/suggest-fix.d.ts.map +1 -0
- package/dist/tools/helpers/suggest-fix.js +119 -0
- package/dist/tools/helpers/suggest-fix.js.map +1 -0
- package/dist/tools/index.d.ts +31 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +13 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/server-management/_shared.d.ts +9 -0
- package/dist/tools/server-management/_shared.d.ts.map +1 -0
- package/dist/tools/server-management/_shared.js +41 -0
- package/dist/tools/server-management/_shared.js.map +1 -0
- package/dist/tools/server-management/data.d.ts +4 -0
- package/dist/tools/server-management/data.d.ts.map +1 -0
- package/dist/tools/server-management/data.js +90 -0
- package/dist/tools/server-management/data.js.map +1 -0
- package/dist/tools/server-management/decisions.d.ts +4 -0
- package/dist/tools/server-management/decisions.d.ts.map +1 -0
- package/dist/tools/server-management/decisions.js +87 -0
- package/dist/tools/server-management/decisions.js.map +1 -0
- package/dist/tools/server-management/index.d.ts +11 -0
- package/dist/tools/server-management/index.d.ts.map +1 -0
- package/dist/tools/server-management/index.js +11 -0
- package/dist/tools/server-management/index.js.map +1 -0
- package/dist/tools/server-management/policies.d.ts +4 -0
- package/dist/tools/server-management/policies.d.ts.map +1 -0
- package/dist/tools/server-management/policies.js +94 -0
- package/dist/tools/server-management/policies.js.map +1 -0
- package/dist/tools/server-management/status.d.ts +4 -0
- package/dist/tools/server-management/status.d.ts.map +1 -0
- package/dist/tools/server-management/status.js +82 -0
- package/dist/tools/server-management/status.js.map +1 -0
- package/dist/types.d.ts +24 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +86 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_format` — format Rego source via `opa fmt`.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent: running it on already-formatted source produces
|
|
5
|
+
* identical output and `changed: false`.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
9
|
+
import { err, ok } from '../../lib/errors.js';
|
|
10
|
+
import { mapSubprocessFailure, tryParseJson, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
11
|
+
const RegoFormatInput = {
|
|
12
|
+
source: z.string().min(1).describe('Rego source code to format.'),
|
|
13
|
+
};
|
|
14
|
+
export function registerRegoFormat(server, config) {
|
|
15
|
+
const opa = new OpaCli(config);
|
|
16
|
+
server.registerTool('rego_format', {
|
|
17
|
+
title: 'Format Rego',
|
|
18
|
+
description: 'Format Rego source code using `opa fmt`. Returns the formatted source and a `changed` flag indicating whether the input was already canonical.',
|
|
19
|
+
inputSchema: RegoFormatInput,
|
|
20
|
+
}, async ({ source }) => {
|
|
21
|
+
return withToolEnvelope(config, async () => {
|
|
22
|
+
const result = await opa.fmt({ source });
|
|
23
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
24
|
+
if (subprocessFailure)
|
|
25
|
+
return subprocessFailure;
|
|
26
|
+
if (result.exitCode !== 0) {
|
|
27
|
+
// `opa fmt` only fails when the source cannot be parsed.
|
|
28
|
+
// The error report goes to stderr as JSON (or as plain text
|
|
29
|
+
// for older OPA builds). Tools should surface whichever is
|
|
30
|
+
// available.
|
|
31
|
+
const parsedErrors = tryParseJson(result.stderr);
|
|
32
|
+
return err('INVALID_REGO', 'opa fmt rejected the source; the input is not parseable Rego.', {
|
|
33
|
+
details: parsedErrors ?? { stderr: result.stderr.trim() },
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const formatted = result.stdout;
|
|
37
|
+
return ok({
|
|
38
|
+
formatted,
|
|
39
|
+
changed: formatted !== source,
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/tools/authoring/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEjG,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAClE,CAAC;AAOF,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAc;IAClE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,gJAAgJ;QAClJ,WAAW,EAAE,eAAe;KAC7B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,OAAO,gBAAgB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;YACzC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAEzC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,yDAAyD;gBACzD,4DAA4D;gBAC5D,2DAA2D;gBAC3D,aAAa;gBACb,MAAM,YAAY,GAAG,YAAY,CAE9B,MAAM,CAAC,MAAM,CAAC,CAAC;gBAClB,OAAO,GAAG,CACR,cAAc,EACd,+DAA+D,EAC/D;oBACE,OAAO,EAAE,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1D,CACF,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,CAAmB;gBAC1B,SAAS;gBACT,OAAO,EAAE,SAAS,KAAK,MAAM;aAC9B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category A — Authoring & static analysis.
|
|
3
|
+
*
|
|
4
|
+
* Tools in this category operate on Rego source code without requiring
|
|
5
|
+
* a running OPA server. They wrap `opa fmt`, `opa check`, `opa parse`,
|
|
6
|
+
* `opa inspect`, `opa capabilities`, `opa deps`, and the `regal` linter.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
import type { Config } from '../../config.js';
|
|
10
|
+
export declare function registerAuthoringTools(server: McpServer, config: Config): void;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAS9C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ9E"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerRegoCapabilities } from './capabilities.js';
|
|
2
|
+
import { registerRegoCheck } from './check.js';
|
|
3
|
+
import { registerRegoDeps } from './deps.js';
|
|
4
|
+
import { registerRegoFormat } from './format.js';
|
|
5
|
+
import { registerRegoInspect } from './inspect.js';
|
|
6
|
+
import { registerRegoLint } from './lint.js';
|
|
7
|
+
import { registerRegoParseAst } from './parse.js';
|
|
8
|
+
export function registerAuthoringTools(server, config) {
|
|
9
|
+
registerRegoFormat(server, config);
|
|
10
|
+
registerRegoCheck(server, config);
|
|
11
|
+
registerRegoLint(server, config);
|
|
12
|
+
registerRegoParseAst(server, config);
|
|
13
|
+
registerRegoInspect(server, config);
|
|
14
|
+
registerRegoCapabilities(server, config);
|
|
15
|
+
registerRegoDeps(server, config);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/authoring/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAc;IACtE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface RegoInspectOutput {
|
|
4
|
+
manifest?: unknown;
|
|
5
|
+
namespaces?: Record<string, unknown>;
|
|
6
|
+
annotations?: unknown;
|
|
7
|
+
signatures?: unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare function registerRegoInspect(server: McpServer, config: Config): void;
|
|
10
|
+
//# sourceMappingURL=inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/inspect.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiB9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA0C3E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_inspect` — inspect a bundle, directory, or single Rego file
|
|
3
|
+
* via `opa inspect`. Returns the manifest (if present), namespaces,
|
|
4
|
+
* and rule annotations as JSON.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
8
|
+
import { err, ok } from '../../lib/errors.js';
|
|
9
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
10
|
+
const RegoInspectInput = {
|
|
11
|
+
target: z
|
|
12
|
+
.string()
|
|
13
|
+
.min(1)
|
|
14
|
+
.describe('Path to a bundle archive (`*.tar.gz`), directory, or single Rego file.'),
|
|
15
|
+
};
|
|
16
|
+
export function registerRegoInspect(server, config) {
|
|
17
|
+
const opa = new OpaCli(config);
|
|
18
|
+
server.registerTool('rego_inspect', {
|
|
19
|
+
title: 'Inspect bundle or policy',
|
|
20
|
+
description: 'Inspect an OPA bundle, policy directory, or single Rego file with `opa inspect`. Returns manifest data, namespaces, rule annotations, and (if signed) signature metadata.',
|
|
21
|
+
inputSchema: RegoInspectInput,
|
|
22
|
+
}, async ({ target }) => {
|
|
23
|
+
return withToolEnvelope(config, async () => {
|
|
24
|
+
const validation = validatePaths([target], config, { mustExist: true });
|
|
25
|
+
if (!validation.ok)
|
|
26
|
+
return validation.error;
|
|
27
|
+
const [resolved] = validation.resolved;
|
|
28
|
+
const result = await opa.inspect({ target: resolved });
|
|
29
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
30
|
+
if (subprocessFailure)
|
|
31
|
+
return subprocessFailure;
|
|
32
|
+
if (result.exitCode !== 0) {
|
|
33
|
+
return err('INVALID_BUNDLE', 'opa inspect rejected the target — it is not a valid bundle, directory, or Rego file.', {
|
|
34
|
+
details: { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const parsed = tryParseJson(result.stdout);
|
|
38
|
+
if (parsed === undefined) {
|
|
39
|
+
return err('UNKNOWN_ERROR', 'opa inspect produced no parseable JSON output.', {
|
|
40
|
+
details: { stdout: result.stdout.trim() },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return ok(parsed);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/tools/authoring/inspect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,gBAAgB,GAAG;IACvB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC;AASF,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,2KAA2K;QAC7K,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,OAAO,gBAAgB,CAAoB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,UAAU,CAAC,KAAK,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC;YAEvC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAS,EAAE,CAAC,CAAC;YAExD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,GAAG,CACR,gBAAgB,EAChB,sFAAsF,EACtF;oBACE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBACxE,CACF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAoB,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO,GAAG,CAAC,eAAe,EAAE,gDAAgD,EAAE;oBAC5E,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAoB,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
interface LintViolation {
|
|
4
|
+
title?: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
category?: string;
|
|
7
|
+
level?: string;
|
|
8
|
+
location?: unknown;
|
|
9
|
+
related_resources?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface RegoLintOutput {
|
|
12
|
+
violations: LintViolation[];
|
|
13
|
+
notices?: unknown[];
|
|
14
|
+
summary?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare function registerRegoLint(server: McpServer, config: Config): void;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=lint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/lint.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAoC9C,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA2BD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiExE"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_lint` — lint Rego with the optional `regal` binary.
|
|
3
|
+
*
|
|
4
|
+
* The only authoring tool that requires Regal. Returns
|
|
5
|
+
* `REGAL_NOT_FOUND` with an install hint if the binary is missing.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { RegalCli } from '../../lib/regal-cli.js';
|
|
9
|
+
import { err, ok } from '../../lib/errors.js';
|
|
10
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
11
|
+
const RegoLintInput = {
|
|
12
|
+
source: z.string().optional().describe('Inline Rego source. Mutually exclusive with `paths`.'),
|
|
13
|
+
paths: z
|
|
14
|
+
.array(z.string())
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Filesystem paths to lint. Each path must be inside an allowed root (OPA_MCP_ALLOWED_PATHS).'),
|
|
17
|
+
configFile: z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Path to a Regal config file (defaults to .regal/config.yaml lookup).'),
|
|
21
|
+
disable: z.array(z.string()).optional().describe('Disable specific named rules.'),
|
|
22
|
+
enable: z.array(z.string()).optional().describe('Enable specific named rules.'),
|
|
23
|
+
disableCategory: z
|
|
24
|
+
.array(z.string())
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Disable entire rule categories (e.g. style, idiomatic, bugs).'),
|
|
27
|
+
enableCategory: z.array(z.string()).optional().describe('Enable entire rule categories.'),
|
|
28
|
+
failLevel: z
|
|
29
|
+
.enum(['error', 'warning'])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Severity at which Regal returns a non-zero exit. Default: `error`.'),
|
|
32
|
+
ignoreFiles: z.array(z.string()).optional().describe('Glob patterns to skip.'),
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Matches the temp filenames RegalCli writes inline source to. The
|
|
36
|
+
* basename anchor (`$`) is intentional: any path ending in our
|
|
37
|
+
* temp-file pattern is ours, regardless of whether the OS reports it
|
|
38
|
+
* with forward or back slashes or what tmpdir() resolves to.
|
|
39
|
+
*/
|
|
40
|
+
const INLINE_TEMP_PATH = /orygn-opa-mcp-[0-9a-f-]+\.rego$/i;
|
|
41
|
+
/**
|
|
42
|
+
* Replace the leaking temp-file path in violation locations with
|
|
43
|
+
* `<inline>` when the call used inline source, so users see "this came
|
|
44
|
+
* from your inline source" instead of `/tmp/...orygn-opa-mcp-<uuid>.rego`.
|
|
45
|
+
* Returns a new array; the input is not mutated.
|
|
46
|
+
*/
|
|
47
|
+
function rewriteInlineLocations(violations) {
|
|
48
|
+
return violations.map((violation) => {
|
|
49
|
+
const loc = violation.location;
|
|
50
|
+
if (!loc || typeof loc !== 'object')
|
|
51
|
+
return violation;
|
|
52
|
+
const locObj = loc;
|
|
53
|
+
const file = locObj['file'];
|
|
54
|
+
if (typeof file !== 'string' || !INLINE_TEMP_PATH.test(file))
|
|
55
|
+
return violation;
|
|
56
|
+
return { ...violation, location: { ...locObj, file: '<inline>' } };
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export function registerRegoLint(server, config) {
|
|
60
|
+
const regal = new RegalCli(config);
|
|
61
|
+
server.registerTool('rego_lint', {
|
|
62
|
+
title: 'Lint Rego',
|
|
63
|
+
description: 'Lint Rego source with the Regal linter. Returns categorized violations (style, bugs, idiomatic, performance) with file/line locations. Requires `regal` on PATH or `REGAL_BINARY` set; returns REGAL_NOT_FOUND otherwise. When called with inline `source`, location-bound rules whose verdict depends on the on-disk path (`directory-package-mismatch`) are auto-disabled to avoid temp-file false positives, and `location.file` is reported as `<inline>` instead of the randomized temp path. Re-enable those rules via `enable` if your workflow actually needs them.',
|
|
64
|
+
inputSchema: RegoLintInput,
|
|
65
|
+
}, async (input) => {
|
|
66
|
+
return withToolEnvelope(config, async () => {
|
|
67
|
+
const { source, paths } = input;
|
|
68
|
+
if (!source && !paths?.length) {
|
|
69
|
+
return err('INVALID_INPUT', 'rego_lint requires either `source` or at least one entry in `paths`.');
|
|
70
|
+
}
|
|
71
|
+
if (source && paths?.length) {
|
|
72
|
+
return err('INVALID_INPUT', 'rego_lint does not accept both `source` and `paths`.');
|
|
73
|
+
}
|
|
74
|
+
let resolvedPaths;
|
|
75
|
+
if (paths?.length) {
|
|
76
|
+
const validation = validatePaths(paths, config, { mustExist: true });
|
|
77
|
+
if (!validation.ok)
|
|
78
|
+
return validation.error;
|
|
79
|
+
resolvedPaths = validation.resolved;
|
|
80
|
+
}
|
|
81
|
+
const result = await regal.lint({
|
|
82
|
+
source,
|
|
83
|
+
paths: resolvedPaths,
|
|
84
|
+
configFile: input.configFile,
|
|
85
|
+
disable: input.disable,
|
|
86
|
+
enable: input.enable,
|
|
87
|
+
disableCategory: input.disableCategory,
|
|
88
|
+
enableCategory: input.enableCategory,
|
|
89
|
+
failLevel: input.failLevel,
|
|
90
|
+
ignoreFiles: input.ignoreFiles,
|
|
91
|
+
});
|
|
92
|
+
const subprocessFailure = mapSubprocessFailure(result, 'regal');
|
|
93
|
+
if (subprocessFailure)
|
|
94
|
+
return subprocessFailure;
|
|
95
|
+
const parsed = tryParseJson(result.stdout);
|
|
96
|
+
if (!parsed) {
|
|
97
|
+
return err('UNKNOWN_ERROR', 'regal lint produced no parseable JSON output.', {
|
|
98
|
+
details: { stderr: result.stderr.trim(), exitCode: result.exitCode },
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const rawViolations = parsed.violations ?? [];
|
|
102
|
+
const violations = source !== undefined ? rewriteInlineLocations(rawViolations) : rawViolations;
|
|
103
|
+
return ok({
|
|
104
|
+
violations,
|
|
105
|
+
notices: parsed.notices,
|
|
106
|
+
summary: parsed.summary,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=lint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lint.js","sourceRoot":"","sources":["../../../src/tools/authoring/lint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface RegoParseAstOutput {
|
|
4
|
+
ast: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare function registerRegoParseAst(server: McpServer, config: Config): void;
|
|
7
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/tools/authoring/parse.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAS9C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmC5E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_parse_ast` — parse Rego source to a JSON AST.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `opa parse --format=json`. Useful for tools that want to walk
|
|
5
|
+
* the structure of a policy programmatically (rule discovery, ref
|
|
6
|
+
* extraction, etc.) without re-implementing the parser.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
10
|
+
import { err, ok } from '../../lib/errors.js';
|
|
11
|
+
import { mapSubprocessFailure, tryParseJson, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
12
|
+
const RegoParseAstInput = {
|
|
13
|
+
source: z.string().min(1).describe('Rego source code to parse.'),
|
|
14
|
+
};
|
|
15
|
+
export function registerRegoParseAst(server, config) {
|
|
16
|
+
const opa = new OpaCli(config);
|
|
17
|
+
server.registerTool('rego_parse_ast', {
|
|
18
|
+
title: 'Parse Rego to AST',
|
|
19
|
+
description: 'Parse Rego source to a JSON AST using `opa parse`. Returns the AST as a tree of nodes (package, imports, rules, expressions, terms). Use this when you need to introspect policy structure programmatically.',
|
|
20
|
+
inputSchema: RegoParseAstInput,
|
|
21
|
+
}, async ({ source }) => {
|
|
22
|
+
return withToolEnvelope(config, async () => {
|
|
23
|
+
const result = await opa.parse({ source });
|
|
24
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
25
|
+
if (subprocessFailure)
|
|
26
|
+
return subprocessFailure;
|
|
27
|
+
if (result.exitCode !== 0) {
|
|
28
|
+
const parsed = tryParseJson(result.stdout);
|
|
29
|
+
return err('INVALID_REGO', 'opa parse rejected the source.', {
|
|
30
|
+
details: parsed ?? { stderr: result.stderr.trim() },
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const ast = tryParseJson(result.stdout);
|
|
34
|
+
if (ast === undefined) {
|
|
35
|
+
return err('UNKNOWN_ERROR', 'opa parse produced no parseable JSON on stdout.', {
|
|
36
|
+
details: { stdout: result.stdout.trim() },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return ok({ ast });
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/tools/authoring/parse.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEjG,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;CACjE,CAAC;AAMF,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,MAAc;IACpE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,8MAA8M;QAChN,WAAW,EAAE,iBAAiB;KAC/B,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,OAAO,gBAAgB,CAAqB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAE3C,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAyB,MAAM,CAAC,MAAM,CAAC,CAAC;gBACnE,OAAO,GAAG,CAAC,cAAc,EAAE,gCAAgC,EAAE;oBAC3D,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBACpD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,OAAO,GAAG,CAAC,eAAe,EAAE,iDAAiD,EAAE;oBAC7E,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface OpaBundleBuildOutput {
|
|
4
|
+
output: string;
|
|
5
|
+
bytes: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerOpaBundleBuild(server: McpServer, config: Config): void;
|
|
8
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/build.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiC9C,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2D9E"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `opa_bundle_build` — build a deployable bundle from policy + data
|
|
3
|
+
* paths via `opa build`.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
7
|
+
import { err, ok } from '../../lib/errors.js';
|
|
8
|
+
import { mapSubprocessFailure, validatePaths, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
|
+
const OpaBundleBuildInput = {
|
|
10
|
+
paths: z
|
|
11
|
+
.array(z.string())
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe('Policy / data paths to include. Each must be in an allowed root.'),
|
|
14
|
+
output: z
|
|
15
|
+
.string()
|
|
16
|
+
.min(1)
|
|
17
|
+
.describe('Output bundle path (typically `*.tar.gz`). Must be in an allowed root.'),
|
|
18
|
+
optimize: z
|
|
19
|
+
.union([z.literal(0), z.literal(1), z.literal(2)])
|
|
20
|
+
.optional()
|
|
21
|
+
.describe('Optimization level (0 = none, 2 = aggressive).'),
|
|
22
|
+
revision: z.string().optional().describe('Bundle revision string written to the manifest.'),
|
|
23
|
+
target: z
|
|
24
|
+
.enum(['rego', 'wasm'])
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Build target (default `rego`; `wasm` compiles to WebAssembly).'),
|
|
27
|
+
entrypoints: z
|
|
28
|
+
.array(z.string())
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Entrypoint refs (required when `target=wasm` or `optimize > 0`).'),
|
|
31
|
+
signingKey: z.string().optional().describe('Path to a signing key for inline signing.'),
|
|
32
|
+
signingAlg: z.string().optional().describe('Signing algorithm (e.g. RS256).'),
|
|
33
|
+
claimsFile: z.string().optional().describe('Path to a claims file for inline signing.'),
|
|
34
|
+
capabilities: z.string().optional().describe('Path to a capabilities JSON file.'),
|
|
35
|
+
};
|
|
36
|
+
export function registerOpaBundleBuild(server, config) {
|
|
37
|
+
const opa = new OpaCli(config);
|
|
38
|
+
server.registerTool('opa_bundle_build', {
|
|
39
|
+
title: 'Build OPA bundle',
|
|
40
|
+
description: 'Build a deployable bundle from policy / data paths using `opa build`. Output is a `.tar.gz` archive with optional inline signing. Supports optimization, custom revision strings, and the WASM target.',
|
|
41
|
+
inputSchema: OpaBundleBuildInput,
|
|
42
|
+
}, async (input) => {
|
|
43
|
+
return withToolEnvelope(config, async () => {
|
|
44
|
+
const inputPaths = [...input.paths, input.output];
|
|
45
|
+
const validation = validatePaths(inputPaths, config);
|
|
46
|
+
if (!validation.ok)
|
|
47
|
+
return validation.error;
|
|
48
|
+
const sourcePaths = validation.resolved.slice(0, input.paths.length);
|
|
49
|
+
const outputPath = validation.resolved[input.paths.length];
|
|
50
|
+
// Validate auxiliary files separately (they may live elsewhere).
|
|
51
|
+
for (const auxPath of [input.signingKey, input.claimsFile, input.capabilities]) {
|
|
52
|
+
if (auxPath) {
|
|
53
|
+
const auxValidation = validatePaths([auxPath], config, { mustExist: true });
|
|
54
|
+
if (!auxValidation.ok)
|
|
55
|
+
return auxValidation.error;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const result = await opa.build({
|
|
59
|
+
paths: sourcePaths,
|
|
60
|
+
output: outputPath,
|
|
61
|
+
optimize: input.optimize,
|
|
62
|
+
revision: input.revision,
|
|
63
|
+
target: input.target,
|
|
64
|
+
entrypoints: input.entrypoints,
|
|
65
|
+
signingKey: input.signingKey,
|
|
66
|
+
signingAlg: input.signingAlg,
|
|
67
|
+
claimsFile: input.claimsFile,
|
|
68
|
+
capabilities: input.capabilities,
|
|
69
|
+
});
|
|
70
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
71
|
+
if (subprocessFailure)
|
|
72
|
+
return subprocessFailure;
|
|
73
|
+
if (result.exitCode !== 0) {
|
|
74
|
+
return err('INVALID_REGO', 'opa build failed.', {
|
|
75
|
+
details: { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const { stat } = await import('node:fs/promises');
|
|
79
|
+
const fileStat = await stat(outputPath);
|
|
80
|
+
return ok({
|
|
81
|
+
output: outputPath,
|
|
82
|
+
bytes: fileStat.size,
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/tools/bundles/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category C — Bundle operations.
|
|
3
|
+
*
|
|
4
|
+
* Wraps `opa build` and `opa sign` for packaging and signing
|
|
5
|
+
* deployable bundles.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { Config } from '../../config.js';
|
|
9
|
+
export declare function registerBundleTools(server: McpServer, config: Config): void;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAI9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG3E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { registerOpaBundleBuild } from './build.js';
|
|
2
|
+
import { registerOpaBundleSign } from './sign.js';
|
|
3
|
+
export function registerBundleTools(server, config) {
|
|
4
|
+
registerOpaBundleBuild(server, config);
|
|
5
|
+
registerOpaBundleSign(server, config);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/bundles/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface OpaBundleSignOutput {
|
|
4
|
+
signed: boolean;
|
|
5
|
+
signaturesPath?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function registerOpaBundleSign(server: McpServer, config: Config): void;
|
|
8
|
+
//# sourceMappingURL=sign.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../../src/tools/bundles/sign.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAe9C,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAuC7E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `opa_bundle_sign` — sign an existing bundle directory or archive
|
|
3
|
+
* via `opa sign`.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
7
|
+
import { err, ok } from '../../lib/errors.js';
|
|
8
|
+
import { mapSubprocessFailure, validatePaths, withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
|
+
const OpaBundleSignInput = {
|
|
10
|
+
bundle: z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.describe('Path to a bundle directory or archive. Must be in an allowed root.'),
|
|
14
|
+
signingKey: z.string().min(1).describe('Path to the signing key.'),
|
|
15
|
+
signingAlg: z.string().optional().describe('Signing algorithm (e.g. RS256). Default: RS256.'),
|
|
16
|
+
claimsFile: z.string().optional().describe('Path to extra claims to include in the signature.'),
|
|
17
|
+
};
|
|
18
|
+
export function registerOpaBundleSign(server, config) {
|
|
19
|
+
const opa = new OpaCli(config);
|
|
20
|
+
server.registerTool('opa_bundle_sign', {
|
|
21
|
+
title: 'Sign OPA bundle',
|
|
22
|
+
description: 'Sign an OPA bundle with a private key using `opa sign`. Writes a `.signatures.json` next to the bundle directory, or updates the archive in place.',
|
|
23
|
+
inputSchema: OpaBundleSignInput,
|
|
24
|
+
}, async (input) => {
|
|
25
|
+
return withToolEnvelope(config, async () => {
|
|
26
|
+
const validation = validatePaths([input.bundle, input.signingKey, ...(input.claimsFile ? [input.claimsFile] : [])], config, { mustExist: true });
|
|
27
|
+
if (!validation.ok)
|
|
28
|
+
return validation.error;
|
|
29
|
+
const result = await opa.sign({
|
|
30
|
+
bundle: validation.resolved[0],
|
|
31
|
+
signingKey: validation.resolved[1],
|
|
32
|
+
signingAlg: input.signingAlg,
|
|
33
|
+
claimsFile: input.claimsFile ? validation.resolved[2] : undefined,
|
|
34
|
+
});
|
|
35
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
36
|
+
if (subprocessFailure)
|
|
37
|
+
return subprocessFailure;
|
|
38
|
+
if (result.exitCode !== 0) {
|
|
39
|
+
return err('INVALID_BUNDLE', 'opa sign failed.', {
|
|
40
|
+
details: { stderr: result.stderr.trim() },
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return ok({ signed: true });
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=sign.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign.js","sourceRoot":"","sources":["../../../src/tools/bundles/sign.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAElG,MAAM,kBAAkB,GAAG;IACzB,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,oEAAoE,CAAC;IACjF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAClE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IAC7F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CAChG,CAAC;AAOF,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAc;IACrE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,oJAAoJ;QACtJ,WAAW,EAAE,kBAAkB;KAChC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,OAAO,gBAAgB,CAAsB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,UAAU,GAAG,aAAa,CAC9B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EACjF,MAAM,EACN,EAAE,SAAS,EAAE,IAAI,EAAE,CACpB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,EAAE;gBAAE,OAAO,UAAU,CAAC,KAAK,CAAC;YAE5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC;gBAC5B,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE;gBAC/B,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAE;gBACnC,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;aAClE,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,GAAG,CAAC,gBAAgB,EAAE,kBAAkB,EAAE;oBAC/C,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;iBAC1C,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAsB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helpers for the evaluation tool category.
|
|
3
|
+
*
|
|
4
|
+
* `rego_eval` and its three trace/profile/coverage variants all share
|
|
5
|
+
* the same input/output shape and error handling — only the OPA flags
|
|
6
|
+
* differ. The shared `runEval` helper takes the resolved EvalInput and
|
|
7
|
+
* returns an envelope; each tool's handler is a thin adapter that
|
|
8
|
+
* preps inputs and forwards.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import type { Config } from '../../config.js';
|
|
12
|
+
import type { OpaCli } from '../../lib/opa-cli.js';
|
|
13
|
+
import type { ToolEnvelope } from '../../types.js';
|
|
14
|
+
/** Common input fields shared across rego_eval and its variants. */
|
|
15
|
+
export declare const SharedEvalInput: {
|
|
16
|
+
query: z.ZodString;
|
|
17
|
+
source: z.ZodOptional<z.ZodString>;
|
|
18
|
+
paths: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
19
|
+
input: z.ZodOptional<z.ZodUnknown>;
|
|
20
|
+
inputPath: z.ZodOptional<z.ZodString>;
|
|
21
|
+
unknowns: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
22
|
+
partial: z.ZodOptional<z.ZodBoolean>;
|
|
23
|
+
strictBuiltinErrors: z.ZodOptional<z.ZodBoolean>;
|
|
24
|
+
};
|
|
25
|
+
export interface RegoEvalOutput {
|
|
26
|
+
result?: unknown[];
|
|
27
|
+
errors?: unknown[];
|
|
28
|
+
metrics?: Record<string, unknown>;
|
|
29
|
+
explanation?: unknown[];
|
|
30
|
+
profile?: unknown[];
|
|
31
|
+
coverage?: unknown;
|
|
32
|
+
}
|
|
33
|
+
interface EvalArgs {
|
|
34
|
+
query: string;
|
|
35
|
+
source?: string;
|
|
36
|
+
paths?: string[];
|
|
37
|
+
input?: unknown;
|
|
38
|
+
inputPath?: string;
|
|
39
|
+
unknowns?: string[];
|
|
40
|
+
partial?: boolean;
|
|
41
|
+
strictBuiltinErrors?: boolean;
|
|
42
|
+
}
|
|
43
|
+
interface EvalFlags {
|
|
44
|
+
explain?: 'full' | 'notes' | 'fails' | 'debug';
|
|
45
|
+
profile?: boolean;
|
|
46
|
+
coverage?: boolean;
|
|
47
|
+
metrics?: boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Validate inputs (paths, input/inputPath conflict), call `opa eval`,
|
|
51
|
+
* and return the structured envelope.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runEval(opa: OpaCli, config: Config, args: EvalArgs, flags: EvalFlags): Promise<ToolEnvelope<RegoEvalOutput>>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,oEAAoE;AACpE,eAAO,MAAM,eAAe;;;;;;;;;CAwB3B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,SAAS;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CA2DvC"}
|