@orygn/opa-mcp 0.1.9 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +51 -0
- package/README.md +54 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +1 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/lib/conftest-cli.d.ts +144 -0
- package/dist/lib/conftest-cli.d.ts.map +1 -0
- package/dist/lib/conftest-cli.js +224 -0
- package/dist/lib/conftest-cli.js.map +1 -0
- package/dist/lib/tool-helpers.d.ts +1 -1
- package/dist/lib/tool-helpers.d.ts.map +1 -1
- package/dist/lib/tool-helpers.js +8 -2
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +14 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/conftest/index.d.ts +4 -0
- package/dist/tools/conftest/index.d.ts.map +1 -0
- package/dist/tools/conftest/index.js +11 -0
- package/dist/tools/conftest/index.js.map +1 -0
- package/dist/tools/conftest/pull.d.ts +10 -0
- package/dist/tools/conftest/pull.d.ts.map +1 -0
- package/dist/tools/conftest/pull.js +83 -0
- package/dist/tools/conftest/pull.js.map +1 -0
- package/dist/tools/conftest/push.d.ts +10 -0
- package/dist/tools/conftest/push.d.ts.map +1 -0
- package/dist/tools/conftest/push.js +76 -0
- package/dist/tools/conftest/push.js.map +1 -0
- package/dist/tools/conftest/test.d.ts +21 -0
- package/dist/tools/conftest/test.d.ts.map +1 -0
- package/dist/tools/conftest/test.js +186 -0
- package/dist/tools/conftest/test.js.map +1 -0
- package/dist/tools/conftest/verify.d.ts +21 -0
- package/dist/tools/conftest/verify.d.ts.map +1 -0
- package/dist/tools/conftest/verify.js +112 -0
- package/dist/tools/conftest/verify.js.map +1 -0
- package/dist/tools/index.d.ts +11 -9
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `conftest_test` -- evaluate configuration files against Rego policies
|
|
3
|
+
* using the `conftest test` command.
|
|
4
|
+
*
|
|
5
|
+
* Conftest is the standard CLI for policy-as-code testing of Kubernetes
|
|
6
|
+
* manifests, Terraform plans, Dockerfiles, Helm charts, and any other
|
|
7
|
+
* structured configuration. This tool surfaces pass/fail/warn results
|
|
8
|
+
* per file and per namespace so an LLM can explain exactly which policies
|
|
9
|
+
* fired and why.
|
|
10
|
+
*
|
|
11
|
+
* Exit code mapping:
|
|
12
|
+
* null -- conftest binary not found → CONFTEST_NOT_FOUND
|
|
13
|
+
* 0 -- all tests pass (ok: true, passed: true)
|
|
14
|
+
* 1 -- one or more failures (ok: true, passed: false)
|
|
15
|
+
* 2+ -- command error (bad args, policy not found, etc.)
|
|
16
|
+
*/
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
import { ConftestCli } from '../../lib/conftest-cli.js';
|
|
19
|
+
import { err, ok } from '../../lib/errors.js';
|
|
20
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
21
|
+
const ConftestTestInput = {
|
|
22
|
+
files: z
|
|
23
|
+
.array(z.string())
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Filesystem paths to configuration files to evaluate (YAML, JSON, HCL, Dockerfile, etc.). ' +
|
|
26
|
+
'Each path must be inside an allowed root (OPA_MCP_ALLOWED_PATHS). ' +
|
|
27
|
+
'Mutually exclusive with `inlineConfig`.'),
|
|
28
|
+
inlineConfig: z
|
|
29
|
+
.string()
|
|
30
|
+
.optional()
|
|
31
|
+
.describe('Inline configuration content to evaluate (e.g. a Kubernetes manifest as a YAML string). ' +
|
|
32
|
+
'Mutually exclusive with `files`. Defaults to YAML format; set `inlineConfigParser` to override.'),
|
|
33
|
+
inlineConfigParser: z
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('Parser to use for `inlineConfig`. Valid values: yaml (default), json, toml, hcl1, hcl2, ' +
|
|
37
|
+
'ini, xml, dotenv, cue, jsonnet, properties, dockerfile. ' +
|
|
38
|
+
"Ignored when `files` is used (conftest infers the parser from each file's extension)."),
|
|
39
|
+
policy: z
|
|
40
|
+
.string()
|
|
41
|
+
.optional()
|
|
42
|
+
.describe('Path to a directory or file containing Rego policies. ' +
|
|
43
|
+
'Must be inside an allowed root (OPA_MCP_ALLOWED_PATHS). ' +
|
|
44
|
+
'Mutually exclusive with `inlinePolicy`. ' +
|
|
45
|
+
'Omit to let conftest use its default `./policy` directory.'),
|
|
46
|
+
inlinePolicy: z
|
|
47
|
+
.string()
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('Inline Rego policy source. Written to a temporary directory and passed as `--policy`. ' +
|
|
50
|
+
'The policy should declare `package main` (or match the `namespace` parameter). ' +
|
|
51
|
+
'Mutually exclusive with `policy`.'),
|
|
52
|
+
namespace: z
|
|
53
|
+
.string()
|
|
54
|
+
.optional()
|
|
55
|
+
.describe('Rego namespace (package name) to test against. Defaults to `main`. ' +
|
|
56
|
+
'Use `allNamespaces: true` to test all discovered namespaces instead.'),
|
|
57
|
+
allNamespaces: z
|
|
58
|
+
.boolean()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Test policies found in all discovered namespaces. Overrides `namespace`.'),
|
|
61
|
+
data: z
|
|
62
|
+
.array(z.string())
|
|
63
|
+
.optional()
|
|
64
|
+
.describe('Paths to directories from which additional data will be loaded for the Rego policies. ' +
|
|
65
|
+
'Each path must be inside an allowed root.'),
|
|
66
|
+
combine: z
|
|
67
|
+
.boolean()
|
|
68
|
+
.optional()
|
|
69
|
+
.describe('Combine all configuration files into a single input document before evaluating. ' +
|
|
70
|
+
'Useful when policies need to inspect relationships across multiple files.'),
|
|
71
|
+
failOnWarn: z
|
|
72
|
+
.boolean()
|
|
73
|
+
.optional()
|
|
74
|
+
.describe('Return `passed: false` even when only warnings (no hard failures) are present.'),
|
|
75
|
+
};
|
|
76
|
+
export function registerConftestTest(server, config) {
|
|
77
|
+
const conftest = new ConftestCli(config);
|
|
78
|
+
server.registerTool('conftest_test', {
|
|
79
|
+
title: 'Conftest test',
|
|
80
|
+
description: 'Evaluate configuration files (Kubernetes manifests, Terraform plans, Dockerfiles, Helm ' +
|
|
81
|
+
'charts, or any YAML/JSON/HCL/TOML/INI) against Rego policies using `conftest test`. ' +
|
|
82
|
+
'Returns per-file, per-namespace pass/fail/warn results so you can pinpoint exactly which ' +
|
|
83
|
+
'policy rules fired. Requires `conftest` on PATH or `CONFTEST_BINARY` set; returns ' +
|
|
84
|
+
'CONFTEST_NOT_FOUND otherwise. ' +
|
|
85
|
+
'Provide config via `files` (disk paths) or `inlineConfig` (inline string). ' +
|
|
86
|
+
'Provide policy via `policy` (disk path) or `inlinePolicy` (inline Rego source). ' +
|
|
87
|
+
"Omit `policy` and `inlinePolicy` to use conftest's default `./policy` directory.",
|
|
88
|
+
inputSchema: ConftestTestInput,
|
|
89
|
+
annotations: {
|
|
90
|
+
readOnlyHint: true,
|
|
91
|
+
destructiveHint: false,
|
|
92
|
+
idempotentHint: true,
|
|
93
|
+
openWorldHint: false,
|
|
94
|
+
},
|
|
95
|
+
}, async (input, { signal }) => {
|
|
96
|
+
return withToolEnvelope(config, async () => {
|
|
97
|
+
// ── Mutual exclusion checks ──────────────────────────────────────
|
|
98
|
+
if (input.files?.length && input.inlineConfig !== undefined) {
|
|
99
|
+
return err('INVALID_INPUT', '`files` and `inlineConfig` are mutually exclusive.');
|
|
100
|
+
}
|
|
101
|
+
if (!input.files?.length && input.inlineConfig === undefined) {
|
|
102
|
+
return err('INVALID_INPUT', 'Provide either `files` (array of config file paths) or `inlineConfig` (inline config string).');
|
|
103
|
+
}
|
|
104
|
+
if (input.policy !== undefined && input.inlinePolicy !== undefined) {
|
|
105
|
+
return err('INVALID_INPUT', '`policy` and `inlinePolicy` are mutually exclusive.');
|
|
106
|
+
}
|
|
107
|
+
// ── Path validation ──────────────────────────────────────────────
|
|
108
|
+
if (input.files?.length) {
|
|
109
|
+
const v = validatePaths(input.files, config, { mustExist: true });
|
|
110
|
+
if (!v.ok)
|
|
111
|
+
return v.error;
|
|
112
|
+
input = { ...input, files: v.resolved };
|
|
113
|
+
}
|
|
114
|
+
if (input.policy !== undefined) {
|
|
115
|
+
const v = validatePaths([input.policy], config, { mustExist: true });
|
|
116
|
+
if (!v.ok)
|
|
117
|
+
return v.error;
|
|
118
|
+
input = { ...input, policy: v.resolved[0] };
|
|
119
|
+
}
|
|
120
|
+
if (input.data?.length) {
|
|
121
|
+
const v = validatePaths(input.data, config, { mustExist: true });
|
|
122
|
+
if (!v.ok)
|
|
123
|
+
return v.error;
|
|
124
|
+
input = { ...input, data: v.resolved };
|
|
125
|
+
}
|
|
126
|
+
// ── Run conftest ─────────────────────────────────────────────────
|
|
127
|
+
const result = await conftest.test({
|
|
128
|
+
files: input.files,
|
|
129
|
+
inlineConfig: input.inlineConfig,
|
|
130
|
+
inlineConfigParser: input.inlineConfigParser,
|
|
131
|
+
policy: input.policy,
|
|
132
|
+
inlinePolicy: input.inlinePolicy,
|
|
133
|
+
namespace: input.namespace,
|
|
134
|
+
allNamespaces: input.allNamespaces,
|
|
135
|
+
data: input.data,
|
|
136
|
+
combine: input.combine,
|
|
137
|
+
failOnWarn: input.failOnWarn,
|
|
138
|
+
}, signal);
|
|
139
|
+
// ── Map universal subprocess failures ────────────────────────────
|
|
140
|
+
const subprocessFailure = mapSubprocessFailure(result, 'conftest');
|
|
141
|
+
if (subprocessFailure)
|
|
142
|
+
return subprocessFailure;
|
|
143
|
+
// ── Exit code 0 / 1: parse JSON results ─────────────────────────
|
|
144
|
+
// Exit 0 = all pass, exit 1 = failures present.
|
|
145
|
+
// Both produce valid JSON on stdout.
|
|
146
|
+
if (result.exitCode === 0 || result.exitCode === 1) {
|
|
147
|
+
const parsed = tryParseJson(result.stdout);
|
|
148
|
+
if (!parsed || !Array.isArray(parsed)) {
|
|
149
|
+
return err('UNKNOWN_ERROR', 'conftest test produced no parseable JSON output.', {
|
|
150
|
+
details: { stderr: result.stderr.trim(), exitCode: result.exitCode },
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const summary = buildSummary(parsed);
|
|
154
|
+
return ok({
|
|
155
|
+
passed: result.exitCode === 0,
|
|
156
|
+
results: parsed,
|
|
157
|
+
summary,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// ── Exit code 2+: command-level error ────────────────────────────
|
|
161
|
+
// Examples: policy directory not found, malformed Rego syntax,
|
|
162
|
+
// unknown --parser value, etc.
|
|
163
|
+
const detail = result.stderr.trim() || result.stdout.trim();
|
|
164
|
+
return err('UNKNOWN_ERROR', `conftest test failed with exit code ${result.exitCode}: ${detail}`, { details: { exitCode: result.exitCode, stderr: result.stderr.trim() } });
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
169
|
+
function buildSummary(results) {
|
|
170
|
+
let passed = 0;
|
|
171
|
+
let failed = 0;
|
|
172
|
+
let warnings = 0;
|
|
173
|
+
let skipped = 0;
|
|
174
|
+
for (const r of results) {
|
|
175
|
+
if (r.failures.length > 0) {
|
|
176
|
+
failed++;
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
passed++;
|
|
180
|
+
}
|
|
181
|
+
warnings += r.warnings.length;
|
|
182
|
+
skipped += r.skipped.length;
|
|
183
|
+
}
|
|
184
|
+
return { passed, failed, warnings, skipped };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../../src/tools/conftest/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
import { type ConftestFileResult } from '../../lib/conftest-cli.js';
|
|
4
|
+
export interface ConftestVerifyOutput {
|
|
5
|
+
/** `true` when all `test_*` rules in all test files pass. */
|
|
6
|
+
passed: boolean;
|
|
7
|
+
/** Per-test-file results. */
|
|
8
|
+
results: ConftestFileResult[];
|
|
9
|
+
summary: {
|
|
10
|
+
/** Number of test files with zero failures. */
|
|
11
|
+
passed: number;
|
|
12
|
+
/** Number of test files with at least one failure. */
|
|
13
|
+
failed: number;
|
|
14
|
+
/** Total test cases that passed (sum of `successes` across all files). */
|
|
15
|
+
totalPassed: number;
|
|
16
|
+
/** Total test cases that failed (sum of `failures` across all files). */
|
|
17
|
+
totalFailed: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function registerConftestVerify(server: McpServer, config: Config): void;
|
|
21
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../../src/tools/conftest/verify.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AA8BjF,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB,6BAA6B;IAC7B,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,OAAO,EAAE;QACP,+CAA+C;QAC/C,MAAM,EAAE,MAAM,CAAC;QACf,sDAAsD;QACtD,MAAM,EAAE,MAAM,CAAC;QACf,0EAA0E;QAC1E,WAAW,EAAE,MAAM,CAAC;QACpB,yEAAyE;QACzE,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAyE9E"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `conftest_verify` -- run the `_test.rego` unit tests that live inside
|
|
3
|
+
* a conftest policy directory.
|
|
4
|
+
*
|
|
5
|
+
* Conftest verify is conftest's equivalent of `opa test`: it evaluates
|
|
6
|
+
* rules whose names begin with `test_` inside `*_test.rego` files within
|
|
7
|
+
* the policy directory. Use this to confirm that the policies themselves
|
|
8
|
+
* are correct before deploying them.
|
|
9
|
+
*
|
|
10
|
+
* Exit code mapping (same as conftest_test):
|
|
11
|
+
* null -- binary not found → CONFTEST_NOT_FOUND
|
|
12
|
+
* 0 -- all tests pass
|
|
13
|
+
* 1 -- one or more test failures
|
|
14
|
+
* 2+ -- command error
|
|
15
|
+
*/
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import { ConftestCli } from '../../lib/conftest-cli.js';
|
|
18
|
+
import { err, ok } from '../../lib/errors.js';
|
|
19
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
20
|
+
const ConftestVerifyInput = {
|
|
21
|
+
policy: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Path to the directory containing both the Rego policies and the `*_test.rego` test files. ' +
|
|
25
|
+
'Must be inside an allowed root (OPA_MCP_ALLOWED_PATHS). ' +
|
|
26
|
+
"Omit to use conftest's default `./policy` directory."),
|
|
27
|
+
namespace: z
|
|
28
|
+
.string()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Namespace to verify. Defaults to `main`. Omit to verify all namespaces.'),
|
|
31
|
+
data: z
|
|
32
|
+
.array(z.string())
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Paths to data directories. Each must be inside an allowed root (OPA_MCP_ALLOWED_PATHS).'),
|
|
35
|
+
};
|
|
36
|
+
export function registerConftestVerify(server, config) {
|
|
37
|
+
const conftest = new ConftestCli(config);
|
|
38
|
+
server.registerTool('conftest_verify', {
|
|
39
|
+
title: 'Conftest verify',
|
|
40
|
+
description: 'Run the `test_*` rules inside `*_test.rego` files within a conftest policy directory, ' +
|
|
41
|
+
'verifying that the policies themselves are correct. Equivalent to `opa test` but using ' +
|
|
42
|
+
"conftest's policy-loading machinery. Returns per-file pass/fail results. " +
|
|
43
|
+
'Requires `conftest` on PATH or `CONFTEST_BINARY` set; returns CONFTEST_NOT_FOUND otherwise.',
|
|
44
|
+
inputSchema: ConftestVerifyInput,
|
|
45
|
+
annotations: {
|
|
46
|
+
readOnlyHint: true,
|
|
47
|
+
destructiveHint: false,
|
|
48
|
+
idempotentHint: true,
|
|
49
|
+
openWorldHint: false,
|
|
50
|
+
},
|
|
51
|
+
}, async (input, { signal }) => {
|
|
52
|
+
return withToolEnvelope(config, async () => {
|
|
53
|
+
// ── Path validation ──────────────────────────────────────────────
|
|
54
|
+
if (input.policy !== undefined) {
|
|
55
|
+
const v = validatePaths([input.policy], config, { mustExist: true });
|
|
56
|
+
if (!v.ok)
|
|
57
|
+
return v.error;
|
|
58
|
+
input = { ...input, policy: v.resolved[0] };
|
|
59
|
+
}
|
|
60
|
+
if (input.data?.length) {
|
|
61
|
+
const v = validatePaths(input.data, config, { mustExist: true });
|
|
62
|
+
if (!v.ok)
|
|
63
|
+
return v.error;
|
|
64
|
+
input = { ...input, data: v.resolved };
|
|
65
|
+
}
|
|
66
|
+
// ── Run conftest verify ──────────────────────────────────────────
|
|
67
|
+
const result = await conftest.verify({
|
|
68
|
+
policy: input.policy,
|
|
69
|
+
namespace: input.namespace,
|
|
70
|
+
data: input.data,
|
|
71
|
+
}, signal);
|
|
72
|
+
const subprocessFailure = mapSubprocessFailure(result, 'conftest');
|
|
73
|
+
if (subprocessFailure)
|
|
74
|
+
return subprocessFailure;
|
|
75
|
+
if (result.exitCode === 0 || result.exitCode === 1) {
|
|
76
|
+
const parsed = tryParseJson(result.stdout);
|
|
77
|
+
if (!parsed || !Array.isArray(parsed)) {
|
|
78
|
+
return err('UNKNOWN_ERROR', 'conftest verify produced no parseable JSON output.', {
|
|
79
|
+
details: { stderr: result.stderr.trim(), exitCode: result.exitCode },
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const summary = buildVerifySummary(parsed);
|
|
83
|
+
return ok({
|
|
84
|
+
passed: result.exitCode === 0,
|
|
85
|
+
results: parsed,
|
|
86
|
+
summary,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const detail = result.stderr.trim() || result.stdout.trim();
|
|
90
|
+
return err('UNKNOWN_ERROR', `conftest verify failed with exit code ${result.exitCode}: ${detail}`, { details: { exitCode: result.exitCode, stderr: result.stderr.trim() } });
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
95
|
+
function buildVerifySummary(results) {
|
|
96
|
+
let passed = 0;
|
|
97
|
+
let failed = 0;
|
|
98
|
+
let totalPassed = 0;
|
|
99
|
+
let totalFailed = 0;
|
|
100
|
+
for (const r of results) {
|
|
101
|
+
if (r.failures.length > 0) {
|
|
102
|
+
failed++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
passed++;
|
|
106
|
+
}
|
|
107
|
+
totalPassed += r.successes;
|
|
108
|
+
totalFailed += r.failures.length;
|
|
109
|
+
}
|
|
110
|
+
return { passed, failed, totalPassed, totalFailed };
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../../src/tools/conftest/verify.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* here in order; ordering doesn't affect behavior but keeps the
|
|
6
6
|
* declaration site tidy.
|
|
7
7
|
*
|
|
8
|
-
* Tools
|
|
8
|
+
* Tools (47 total):
|
|
9
9
|
* Category A -- Authoring: rego_format, rego_check, rego_lint,
|
|
10
10
|
* rego_parse_ast, rego_inspect,
|
|
11
11
|
* rego_capabilities, rego_deps
|
|
@@ -13,13 +13,14 @@
|
|
|
13
13
|
* rego_eval_with_profile,
|
|
14
14
|
* rego_eval_with_coverage, rego_test,
|
|
15
15
|
* rego_bench, rego_compile_query
|
|
16
|
-
* Category C -- Bundles: opa_bundle_build, opa_bundle_sign
|
|
16
|
+
* Category C -- Bundles: opa_bundle_build, opa_bundle_sign,
|
|
17
|
+
* opa_bundle_verify, opa_exec
|
|
17
18
|
* Category D -- Server mgmt: opa_list_policies, opa_get_policy,
|
|
18
19
|
* opa_put_policy, opa_delete_policy,
|
|
19
20
|
* opa_get_data, opa_put_data,
|
|
20
|
-
* opa_patch_data,
|
|
21
|
-
*
|
|
22
|
-
* opa_status, opa_config
|
|
21
|
+
* opa_patch_data, opa_delete_data,
|
|
22
|
+
* opa_query_decision, opa_compile_query,
|
|
23
|
+
* opa_health, opa_status, opa_config
|
|
23
24
|
* Category E -- Helpers: rego_explain_decision,
|
|
24
25
|
* rego_generate_test_skeleton,
|
|
25
26
|
* rego_describe_policy,
|
|
@@ -27,10 +28,11 @@
|
|
|
27
28
|
* rego_coverage_gaps,
|
|
28
29
|
* rego_security_audit,
|
|
29
30
|
* rego_infer_input_schema,
|
|
30
|
-
* rego_fix,
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
31
|
+
* rego_fix, rego_format_write,
|
|
32
|
+
* rego_migrate_v1, rego_policy_diff
|
|
33
|
+
* Category F -- Conftest: conftest_test, conftest_verify,
|
|
34
|
+
* conftest_pull, conftest_push
|
|
35
|
+
* Category G -- Meta: mcp_server_info
|
|
34
36
|
*/
|
|
35
37
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
36
38
|
import type { Config } from '../config.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAS3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQrE"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { registerAuthoringTools } from './authoring/index.js';
|
|
2
2
|
import { registerBundleTools } from './bundles/index.js';
|
|
3
|
+
import { registerConftestTools } from './conftest/index.js';
|
|
3
4
|
import { registerEvaluationTools } from './evaluation/index.js';
|
|
4
5
|
import { registerHelperTools } from './helpers/index.js';
|
|
5
6
|
import { registerMetaTools } from './meta/index.js';
|
|
@@ -10,6 +11,7 @@ export function registerTools(server, config) {
|
|
|
10
11
|
registerBundleTools(server, config);
|
|
11
12
|
registerServerManagementTools(server, config);
|
|
12
13
|
registerHelperTools(server, config);
|
|
14
|
+
registerConftestTools(server, config);
|
|
13
15
|
registerMetaTools(server, config);
|
|
14
16
|
}
|
|
15
17
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAuCA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,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,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Shared types used across tools, prompts, and resources.
|
|
3
3
|
*/
|
|
4
4
|
/** Standard error codes returned by tools. */
|
|
5
|
-
export type ToolErrorCode = 'INVALID_INPUT' | 'OPA_BINARY_NOT_FOUND' | 'REGAL_NOT_FOUND' | 'REGAL_VERSION_TOO_OLD' | 'INVALID_REGO' | 'INVALID_BUNDLE' | 'EVAL_ERROR' | 'PATH_NOT_ALLOWED' | 'PATH_NOT_FOUND' | 'OPA_UNREACHABLE' | 'OPA_AUTH_FAILED' | 'POLICY_NOT_FOUND' | 'DATA_NOT_FOUND' | 'DEPENDENCY_CONFLICT' | 'NO_TESTS_FOUND' | 'HTTP_SEND_BLOCKED' | 'TIMEOUT' | 'CANCELLED' | 'UNKNOWN_ERROR';
|
|
5
|
+
export type ToolErrorCode = 'INVALID_INPUT' | 'OPA_BINARY_NOT_FOUND' | 'REGAL_NOT_FOUND' | 'REGAL_VERSION_TOO_OLD' | 'CONFTEST_NOT_FOUND' | 'INVALID_REGO' | 'INVALID_BUNDLE' | 'EVAL_ERROR' | 'PATH_NOT_ALLOWED' | 'PATH_NOT_FOUND' | 'OPA_UNREACHABLE' | 'OPA_AUTH_FAILED' | 'POLICY_NOT_FOUND' | 'DATA_NOT_FOUND' | 'DEPENDENCY_CONFLICT' | 'NO_TESTS_FOUND' | 'HTTP_SEND_BLOCKED' | 'TIMEOUT' | 'CANCELLED' | 'UNKNOWN_ERROR';
|
|
6
6
|
/** Structured error payload. */
|
|
7
7
|
export interface ToolError {
|
|
8
8
|
code: ToolErrorCode;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,WAAW,GACX,eAAe,CAAC;AAEpB,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,SAAS,GACT,WAAW,GACX,eAAe,CAAC;AAEpB,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orygn/opa-mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.10",
|
|
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",
|