@orygn/opa-mcp 0.1.1 → 0.1.3
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 +50 -1
- package/README.md +62 -23
- package/dist/config.d.ts +1 -1
- package/dist/config.js +2 -2
- package/dist/constants.d.ts +8 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +1 -1
- package/dist/lib/logger.js +2 -2
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/opa-cli.d.ts +3 -3
- package/dist/lib/opa-cli.js +4 -4
- package/dist/lib/opa-client.d.ts +1 -1
- package/dist/lib/regal-cli.d.ts +4 -4
- package/dist/lib/regal-cli.js +5 -5
- package/dist/lib/subprocess.d.ts +1 -1
- package/dist/lib/subprocess.js +2 -2
- package/dist/lib/tool-helpers.d.ts +1 -1
- package/dist/prompts/index.js +6 -6
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/index.d.ts +4 -4
- package/dist/resources/patterns.d.ts +1 -1
- package/dist/resources/patterns.d.ts.map +1 -1
- package/dist/resources/patterns.js +7 -7
- package/dist/resources/style-guide.d.ts +1 -1
- package/dist/resources/style-guide.d.ts.map +1 -1
- package/dist/resources/style-guide.js +3 -3
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +4 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/authoring/capabilities.d.ts +2 -0
- package/dist/tools/authoring/capabilities.d.ts.map +1 -1
- package/dist/tools/authoring/capabilities.js +24 -4
- package/dist/tools/authoring/capabilities.js.map +1 -1
- package/dist/tools/authoring/check.js +3 -3
- package/dist/tools/authoring/check.js.map +1 -1
- package/dist/tools/authoring/deps.js +2 -2
- package/dist/tools/authoring/deps.js.map +1 -1
- package/dist/tools/authoring/format.js +1 -1
- package/dist/tools/authoring/index.d.ts +1 -1
- package/dist/tools/authoring/inspect.js +2 -2
- package/dist/tools/authoring/inspect.js.map +1 -1
- package/dist/tools/authoring/lint.js +1 -1
- package/dist/tools/authoring/parse.js +1 -1
- package/dist/tools/bundles/build.js +1 -1
- package/dist/tools/bundles/index.d.ts +1 -1
- package/dist/tools/bundles/sign.js +1 -1
- package/dist/tools/evaluation/_shared.d.ts +1 -1
- package/dist/tools/evaluation/_shared.js +1 -1
- package/dist/tools/evaluation/bench.js +1 -1
- package/dist/tools/evaluation/compile.d.ts +2 -2
- package/dist/tools/evaluation/compile.js +1 -1
- package/dist/tools/evaluation/compile.js.map +1 -1
- package/dist/tools/evaluation/eval.d.ts +2 -2
- package/dist/tools/evaluation/eval.js +1 -1
- package/dist/tools/evaluation/eval.js.map +1 -1
- package/dist/tools/evaluation/index.d.ts +1 -1
- package/dist/tools/evaluation/test.js +1 -1
- package/dist/tools/helpers/coverage-gaps.d.ts +29 -0
- package/dist/tools/helpers/coverage-gaps.d.ts.map +1 -0
- package/dist/tools/helpers/coverage-gaps.js +125 -0
- package/dist/tools/helpers/coverage-gaps.js.map +1 -0
- package/dist/tools/helpers/describe-policy.js +1 -1
- package/dist/tools/helpers/explain-decision.d.ts +1 -1
- package/dist/tools/helpers/explain-decision.js +1 -1
- package/dist/tools/helpers/explain-decision.js.map +1 -1
- package/dist/tools/helpers/generate-test-skeleton.js +3 -3
- package/dist/tools/helpers/generate-test-skeleton.js.map +1 -1
- package/dist/tools/helpers/index.d.ts +1 -1
- package/dist/tools/helpers/index.d.ts.map +1 -1
- package/dist/tools/helpers/index.js +4 -0
- package/dist/tools/helpers/index.js.map +1 -1
- package/dist/tools/helpers/security-audit.d.ts +21 -0
- package/dist/tools/helpers/security-audit.d.ts.map +1 -0
- package/dist/tools/helpers/security-audit.js +111 -0
- package/dist/tools/helpers/security-audit.js.map +1 -0
- package/dist/tools/helpers/suggest-fix.js +6 -6
- package/dist/tools/helpers/suggest-fix.js.map +1 -1
- package/dist/tools/index.d.ts +9 -6
- 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/tools/meta/index.d.ts +10 -0
- package/dist/tools/meta/index.d.ts.map +1 -0
- package/dist/tools/meta/index.js +5 -0
- package/dist/tools/meta/index.js.map +1 -0
- package/dist/tools/meta/server-info.d.ts +17 -0
- package/dist/tools/meta/server-info.d.ts.map +1 -0
- package/dist/tools/meta/server-info.js +30 -0
- package/dist/tools/meta/server-info.js.map +1 -0
- package/dist/tools/server-management/data.js +1 -1
- package/dist/tools/server-management/data.js.map +1 -1
- package/dist/tools/server-management/decisions.js +1 -1
- package/dist/tools/server-management/decisions.js.map +1 -1
- package/dist/tools/server-management/index.d.ts +1 -1
- package/dist/tools/server-management/policies.js +1 -1
- package/dist/tools/server-management/policies.js.map +1 -1
- package/dist/tools/server-management/status.js +2 -2
- package/dist/tools/server-management/status.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_coverage_gaps` -- run opa test --coverage and surface the
|
|
3
|
+
* uncovered line ranges per file as a structured gap report.
|
|
4
|
+
*
|
|
5
|
+
* OPA emits two JSON documents on stdout when --coverage is set: a
|
|
6
|
+
* test-results array followed by a coverage report object. Both are
|
|
7
|
+
* parsed here; files with uncovered ranges are returned sorted by
|
|
8
|
+
* coverage ascending so the worst-covered files appear first.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from 'zod';
|
|
11
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
12
|
+
import { err, ok } from '../../lib/errors.js';
|
|
13
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
14
|
+
const RegoCoverageGapsInput = {
|
|
15
|
+
paths: z
|
|
16
|
+
.array(z.string())
|
|
17
|
+
.min(1)
|
|
18
|
+
.describe('Test directories or files. opa test looks for *_test.rego siblings of source files.'),
|
|
19
|
+
threshold: z
|
|
20
|
+
.number()
|
|
21
|
+
.min(0)
|
|
22
|
+
.max(100)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Report only files below this coverage percentage (0-100). When omitted, all files with uncovered ranges are reported.'),
|
|
25
|
+
runPattern: z.string().optional().describe('Run only tests whose names match this regex.'),
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Parse the combined stdout of `opa test --coverage --format=json`.
|
|
29
|
+
*
|
|
30
|
+
* OPA emits a JSON test-results array followed by a JSON coverage
|
|
31
|
+
* report object. They may appear on separate lines or concatenated.
|
|
32
|
+
* We scan lines and classify each by shape: arrays are test records,
|
|
33
|
+
* objects with a `files` key are coverage reports.
|
|
34
|
+
*/
|
|
35
|
+
function parseTestAndCoverage(stdout) {
|
|
36
|
+
const testRecords = [];
|
|
37
|
+
let coverageReport;
|
|
38
|
+
// Fast path: entire stdout is already a coverage-only object.
|
|
39
|
+
const full = tryParseJson(stdout);
|
|
40
|
+
if (full && typeof full === 'object' && !Array.isArray(full) && 'files' in full) {
|
|
41
|
+
return { testRecords, coverageReport: full };
|
|
42
|
+
}
|
|
43
|
+
// Scan line-by-line for the two documents.
|
|
44
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
45
|
+
const trimmed = line.trim();
|
|
46
|
+
if (!trimmed)
|
|
47
|
+
continue;
|
|
48
|
+
const parsed = tryParseJson(trimmed);
|
|
49
|
+
if (!parsed)
|
|
50
|
+
continue;
|
|
51
|
+
if (Array.isArray(parsed)) {
|
|
52
|
+
testRecords.push(...parsed);
|
|
53
|
+
}
|
|
54
|
+
else if (typeof parsed === 'object' && parsed !== null && 'files' in parsed) {
|
|
55
|
+
coverageReport = parsed;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { testRecords, coverageReport };
|
|
59
|
+
}
|
|
60
|
+
function countUncoveredLines(ranges) {
|
|
61
|
+
return ranges.reduce((sum, r) => sum + (r.end.row - r.start.row + 1), 0);
|
|
62
|
+
}
|
|
63
|
+
export function registerRegoCoverageGaps(server, config) {
|
|
64
|
+
const opa = new OpaCli(config);
|
|
65
|
+
server.registerTool('rego_coverage_gaps', {
|
|
66
|
+
title: 'Rego test coverage gaps',
|
|
67
|
+
description: 'Run opa test --coverage and return a per-file breakdown of uncovered line ranges. Identifies which rules or branches are not yet exercised by tests. Files are sorted by coverage ascending so the worst-covered files appear first. Use threshold to limit the report to files below a target coverage percentage.',
|
|
68
|
+
inputSchema: RegoCoverageGapsInput,
|
|
69
|
+
}, async ({ paths, threshold, runPattern }) => {
|
|
70
|
+
return withToolEnvelope(config, async () => {
|
|
71
|
+
const validation = validatePaths(paths, config, { mustExist: true });
|
|
72
|
+
if (!validation.ok)
|
|
73
|
+
return validation.error;
|
|
74
|
+
const result = await opa.test({
|
|
75
|
+
paths: validation.resolved,
|
|
76
|
+
coverage: true,
|
|
77
|
+
runPattern,
|
|
78
|
+
});
|
|
79
|
+
const subprocessFailure = mapSubprocessFailure(result, 'opa');
|
|
80
|
+
if (subprocessFailure)
|
|
81
|
+
return subprocessFailure;
|
|
82
|
+
const { testRecords, coverageReport } = parseTestAndCoverage(result.stdout);
|
|
83
|
+
if (!coverageReport) {
|
|
84
|
+
if (result.exitCode !== 0) {
|
|
85
|
+
return err('EVAL_ERROR', 'opa test reported failures or a compile error; coverage is only emitted when all tests pass. Fix the failing tests or policy errors first.', { details: { stderr: result.stderr.trim() } });
|
|
86
|
+
}
|
|
87
|
+
return err('NO_TESTS_FOUND', 'opa test ran but produced no coverage report. Ensure the paths contain *_test.rego files with test_ rules.', {
|
|
88
|
+
hint: 'Test rules must begin with test_ and live in *_test.rego files alongside the policy.',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
const testsPassed = testRecords.filter((r) => r.pass).length;
|
|
92
|
+
const testsFailed = testRecords.filter((r) => r.fail).length;
|
|
93
|
+
const testsSkipped = testRecords.filter((r) => r.skip).length;
|
|
94
|
+
const overallCoverage = coverageReport.coverage ?? 0;
|
|
95
|
+
const filesWithGaps = [];
|
|
96
|
+
for (const [file, report] of Object.entries(coverageReport.files ?? {})) {
|
|
97
|
+
const coveragePercent = report.coverage ?? 0;
|
|
98
|
+
const notCovered = report.not_covered ?? [];
|
|
99
|
+
// Apply threshold filter: skip files already above the target.
|
|
100
|
+
if (threshold !== undefined && coveragePercent >= threshold)
|
|
101
|
+
continue;
|
|
102
|
+
// Skip files with no uncovered ranges at all.
|
|
103
|
+
if (notCovered.length === 0)
|
|
104
|
+
continue;
|
|
105
|
+
filesWithGaps.push({
|
|
106
|
+
file,
|
|
107
|
+
coveragePercent,
|
|
108
|
+
uncoveredRanges: notCovered,
|
|
109
|
+
uncoveredLineCount: countUncoveredLines(notCovered),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Sort worst-covered first so the agent sees the biggest gaps immediately.
|
|
113
|
+
filesWithGaps.sort((a, b) => a.coveragePercent - b.coveragePercent);
|
|
114
|
+
return ok({
|
|
115
|
+
overallCoverage,
|
|
116
|
+
totalFiles: Object.keys(coverageReport.files ?? {}).length,
|
|
117
|
+
filesWithGaps,
|
|
118
|
+
testsPassed,
|
|
119
|
+
testsFailed,
|
|
120
|
+
testsSkipped,
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=coverage-gaps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-gaps.js","sourceRoot":"","sources":["../../../src/tools/helpers/coverage-gaps.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ export function registerRegoExplainDecision(server, config) {
|
|
|
38
38
|
const opa = new OpaCli(config);
|
|
39
39
|
server.registerTool('rego_explain_decision', {
|
|
40
40
|
title: 'Explain Rego decision',
|
|
41
|
-
description: 'Evaluate a Rego query with full tracing and return a structured trace plus per-rule fired/not-fired summary. Use this when you need to answer "why was this denied?"
|
|
41
|
+
description: 'Evaluate a Rego query with full tracing and return a structured trace plus per-rule fired/not-fired summary. Use this when you need to answer "why was this denied?" -- the agent reads the structured trace and narrates the cause without re-implementing the trace parser.',
|
|
42
42
|
inputSchema: SharedEvalInput,
|
|
43
43
|
}, async (args) => {
|
|
44
44
|
return withToolEnvelope(config, async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explain-decision.js","sourceRoot":"","sources":["../../../src/tools/helpers/explain-decision.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAuB,MAAM,0BAA0B,CAAC;AA0BzF,SAAS,cAAc,CAAC,KAA+B;IAIrD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,EAAE,CAAC;YACzB,WAAW,IAAI,CAAC,CAAC;YACjB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACxF,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAAE,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YAC/B,UAAU,IAAI,CAAC,CAAC;YAChB,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1F,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAAE,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YAC/B,UAAU,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO;QACL,WAAW,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAC/B,WAAW;QACX,UAAU;QACV,UAAU;QACV,cAAc;QACd,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAiB,EAAE,MAAc;IAC3E,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT
|
|
1
|
+
{"version":3,"file":"explain-decision.js","sourceRoot":"","sources":["../../../src/tools/helpers/explain-decision.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `rego_generate_test_skeleton`
|
|
2
|
+
* `rego_generate_test_skeleton` -- given a policy, parse its AST and
|
|
3
3
|
* emit a `*_test.rego` skeleton with one stub test per rule.
|
|
4
4
|
*
|
|
5
|
-
* The skeleton is mechanical
|
|
5
|
+
* The skeleton is mechanical -- the agent fills in real assertions.
|
|
6
6
|
*/
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { OpaCli } from '../../lib/opa-cli.js';
|
|
@@ -83,7 +83,7 @@ export function registerRegoGenerateTestSkeleton(server, config) {
|
|
|
83
83
|
.map(ruleNameFromAst)
|
|
84
84
|
.filter((n) => typeof n === 'string' && n.length > 0)));
|
|
85
85
|
if (ruleNames.length === 0) {
|
|
86
|
-
return err('INVALID_INPUT', 'No rules found in the source
|
|
86
|
+
return err('INVALID_INPUT', 'No rules found in the source -- nothing to test.');
|
|
87
87
|
}
|
|
88
88
|
const testFile = makeSkeleton(packageName, ruleNames);
|
|
89
89
|
return ok({ testFile, ruleNames });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-test-skeleton.js","sourceRoot":"","sources":["../../../src/tools/helpers/generate-test-skeleton.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"generate-test-skeleton.js","sourceRoot":"","sources":["../../../src/tools/helpers/generate-test-skeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAQ9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAO3E"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { registerRegoCoverageGaps } from './coverage-gaps.js';
|
|
1
2
|
import { registerRegoDescribePolicy } from './describe-policy.js';
|
|
2
3
|
import { registerRegoExplainDecision } from './explain-decision.js';
|
|
3
4
|
import { registerRegoGenerateTestSkeleton } from './generate-test-skeleton.js';
|
|
5
|
+
import { registerRegoSecurityAudit } from './security-audit.js';
|
|
4
6
|
import { registerRegoSuggestFix } from './suggest-fix.js';
|
|
5
7
|
export function registerHelperTools(server, config) {
|
|
6
8
|
registerRegoExplainDecision(server, config);
|
|
7
9
|
registerRegoGenerateTestSkeleton(server, config);
|
|
8
10
|
registerRegoDescribePolicy(server, config);
|
|
9
11
|
registerRegoSuggestFix(server, config);
|
|
12
|
+
registerRegoCoverageGaps(server, config);
|
|
13
|
+
registerRegoSecurityAudit(server, config);
|
|
10
14
|
}
|
|
11
15
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/helpers/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,gCAAgC,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,2BAA2B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,wBAAwB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { Config } from '../../config.js';
|
|
3
|
+
export interface SecurityFinding {
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
category: string;
|
|
7
|
+
severity: 'high' | 'medium';
|
|
8
|
+
file: string;
|
|
9
|
+
row?: number;
|
|
10
|
+
col?: number;
|
|
11
|
+
remediation: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RegoSecurityAuditOutput {
|
|
14
|
+
totalFindings: number;
|
|
15
|
+
highSeverity: number;
|
|
16
|
+
mediumSeverity: number;
|
|
17
|
+
filesScanned: number;
|
|
18
|
+
findings: SecurityFinding[];
|
|
19
|
+
}
|
|
20
|
+
export declare function registerRegoSecurityAudit(server: McpServer, config: Config): void;
|
|
21
|
+
//# sourceMappingURL=security-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-audit.d.ts","sourceRoot":"","sources":["../../../src/tools/helpers/security-audit.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgD9C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAwCD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAwEjF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `rego_security_audit` -- run regal lint filtered to the security
|
|
3
|
+
* and bugs categories and return a severity-grouped finding report.
|
|
4
|
+
*
|
|
5
|
+
* This is a focused slice of `rego_lint`: only the rules most relevant
|
|
6
|
+
* to security and correctness are enabled. The result groups findings
|
|
7
|
+
* by severity with remediation guidance so the agent can prioritize
|
|
8
|
+
* fixes without wading through style and formatting noise.
|
|
9
|
+
*
|
|
10
|
+
* Requires regal. Returns REGAL_NOT_FOUND if the binary is absent.
|
|
11
|
+
*/
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import { RegalCli } from '../../lib/regal-cli.js';
|
|
14
|
+
import { err, ok } from '../../lib/errors.js';
|
|
15
|
+
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
16
|
+
const RegoSecurityAuditInput = {
|
|
17
|
+
paths: z
|
|
18
|
+
.array(z.string())
|
|
19
|
+
.min(1)
|
|
20
|
+
.describe('Policy directories or files to audit. Each must be inside an allowed root (OPA_MCP_ALLOWED_PATHS). Pass the root of your policy fleet to scan everything at once.'),
|
|
21
|
+
configFile: z
|
|
22
|
+
.string()
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Path to a Regal config file. Useful when your repo has custom rule configuration.'),
|
|
25
|
+
ignoreFiles: z.array(z.string()).optional().describe('Glob patterns to exclude from the audit.'),
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Remediation hints keyed by Regal rule title. The values give a
|
|
29
|
+
* specific, actionable fix rather than repeating the violation message.
|
|
30
|
+
*/
|
|
31
|
+
const REMEDIATION_HINTS = {
|
|
32
|
+
'credentials-in-body': 'Remove credentials from the HTTP request body literal. Use OPA environment variables or a data bundle to inject secrets at runtime.',
|
|
33
|
+
'http-send-using-http': 'Replace the http:// URL with https:// to prevent credentials or tokens from being transmitted in plaintext.',
|
|
34
|
+
'jwt-credentials-in-source': 'Move JWT tokens and signing keys out of policy source into data bundles or OPA environment variables.',
|
|
35
|
+
'no-defined-entrypoint': 'Add an @entrypoint annotation to the rule that serves as the policy decision point so automated analysis can identify the entry.',
|
|
36
|
+
'constant-condition': 'The condition is always true or always false; remove it or fix the logic so the rule body reflects a real runtime check.',
|
|
37
|
+
'deprecated-builtin': 'Replace the deprecated builtin with its current equivalent before upgrading OPA, where deprecated functions may be removed.',
|
|
38
|
+
'duplicate-definition': 'Remove the duplicate rule definition. Multiple conflicting definitions cause non-deterministic evaluation and can mask security gaps.',
|
|
39
|
+
'impossible-if': 'The rule condition can never be satisfied; it will never contribute to the decision. Review the logic for a typo or inverted condition.',
|
|
40
|
+
'impossible-not': 'The negation is of a condition that is always false, so not(...) is always true. Review whether the rule is overly permissive.',
|
|
41
|
+
'inconsistent-args': 'The function is called with a different number of arguments than its definition. The extra or missing argument silently makes the call undefined.',
|
|
42
|
+
'unresolved-import': 'The import path does not match any package in the bundle. Remove or fix the import to ensure the policy loads correctly.',
|
|
43
|
+
'unreachable-rule': 'The rule can never be evaluated given the existing rules. It may represent dead code that masks a missing test case.',
|
|
44
|
+
'shadowing-builtin': 'Rename the local variable to avoid shadowing the OPA builtin. Shadowed builtins silently change semantics.',
|
|
45
|
+
'sprintf-formatting': 'The sprintf format string and the number of arguments do not match. This produces undefined output at runtime.',
|
|
46
|
+
};
|
|
47
|
+
const DEFAULT_REMEDIATION = 'Review the Regal documentation for this rule and apply the recommended fix before deploying to production.';
|
|
48
|
+
export function registerRegoSecurityAudit(server, config) {
|
|
49
|
+
const regal = new RegalCli(config);
|
|
50
|
+
server.registerTool('rego_security_audit', {
|
|
51
|
+
title: 'Rego security audit',
|
|
52
|
+
description: 'Run regal lint restricted to the security and bugs categories across one or more policy directories. Returns findings grouped by severity (high/medium) with remediation guidance. Use this for a periodic fleet-wide security sweep rather than per-file style review. Requires regal.',
|
|
53
|
+
inputSchema: RegoSecurityAuditInput,
|
|
54
|
+
}, async ({ paths, configFile, ignoreFiles }) => {
|
|
55
|
+
return withToolEnvelope(config, async () => {
|
|
56
|
+
const validation = validatePaths(paths, config, { mustExist: true });
|
|
57
|
+
if (!validation.ok)
|
|
58
|
+
return validation.error;
|
|
59
|
+
const result = await regal.lint({
|
|
60
|
+
paths: validation.resolved,
|
|
61
|
+
configFile,
|
|
62
|
+
ignoreFiles,
|
|
63
|
+
// Start from zero rules and enable only security + bugs.
|
|
64
|
+
disableAll: true,
|
|
65
|
+
enableCategory: ['security', 'bugs'],
|
|
66
|
+
// Fail on errors only; warnings are still surfaced in JSON.
|
|
67
|
+
failLevel: 'error',
|
|
68
|
+
});
|
|
69
|
+
const subprocessFailure = mapSubprocessFailure(result, 'regal');
|
|
70
|
+
if (subprocessFailure)
|
|
71
|
+
return subprocessFailure;
|
|
72
|
+
const parsed = tryParseJson(result.stdout);
|
|
73
|
+
if (!parsed) {
|
|
74
|
+
return err('UNKNOWN_ERROR', 'regal lint produced no parseable JSON output.', {
|
|
75
|
+
details: { stderr: result.stderr.trim(), exitCode: result.exitCode },
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
const rawViolations = parsed.violations ?? [];
|
|
79
|
+
const filesScanned = parsed.summary?.files_scanned ?? 0;
|
|
80
|
+
const findings = rawViolations.map((v) => {
|
|
81
|
+
const title = v.title ?? '';
|
|
82
|
+
const severity = v.level === 'error' ? 'high' : 'medium';
|
|
83
|
+
const remediation = REMEDIATION_HINTS[title] ?? DEFAULT_REMEDIATION;
|
|
84
|
+
return {
|
|
85
|
+
title,
|
|
86
|
+
description: v.description ?? '',
|
|
87
|
+
category: v.category ?? '',
|
|
88
|
+
severity,
|
|
89
|
+
file: v.location?.file ?? '',
|
|
90
|
+
row: v.location?.row,
|
|
91
|
+
col: v.location?.col,
|
|
92
|
+
remediation,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
// Sort high severity first, then by file path for stable ordering.
|
|
96
|
+
findings.sort((a, b) => {
|
|
97
|
+
if (a.severity !== b.severity)
|
|
98
|
+
return a.severity === 'high' ? -1 : 1;
|
|
99
|
+
return a.file.localeCompare(b.file);
|
|
100
|
+
});
|
|
101
|
+
return ok({
|
|
102
|
+
totalFindings: findings.length,
|
|
103
|
+
highSeverity: findings.filter((f) => f.severity === 'high').length,
|
|
104
|
+
mediumSeverity: findings.filter((f) => f.severity === 'medium').length,
|
|
105
|
+
filesScanned,
|
|
106
|
+
findings,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=security-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security-audit.js","sourceRoot":"","sources":["../../../src/tools/helpers/security-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `rego_suggest_fix`
|
|
2
|
+
* `rego_suggest_fix` -- propose mechanical fixes for common Rego
|
|
3
3
|
* compile errors and Regal lint findings.
|
|
4
4
|
*
|
|
5
|
-
* The tool is deliberately rule-based
|
|
5
|
+
* The tool is deliberately rule-based -- it doesn't call out to an LLM.
|
|
6
6
|
* Common error codes have well-known mechanical fixes; we surface
|
|
7
7
|
* those, and for everything else we hand back a structured "no
|
|
8
8
|
* automated fix available, here's what we know" envelope so the agent
|
|
@@ -53,7 +53,7 @@ const KNOWN_FIXES = [
|
|
|
53
53
|
{
|
|
54
54
|
match: (code) => code === 'rego_type_error',
|
|
55
55
|
suggest: (message) => ({
|
|
56
|
-
suggestion: `Type mismatch: ${message.replace(/^rego_type_error:\s*/, '')}. Reconcile the operand types
|
|
56
|
+
suggestion: `Type mismatch: ${message.replace(/^rego_type_error:\s*/, '')}. Reconcile the operand types -- most often this is comparing a string with a number, or indexing a value with the wrong key shape.`,
|
|
57
57
|
confidence: 'medium',
|
|
58
58
|
}),
|
|
59
59
|
},
|
|
@@ -67,7 +67,7 @@ const KNOWN_FIXES = [
|
|
|
67
67
|
{
|
|
68
68
|
match: (code) => code === 'rego_compile_error',
|
|
69
69
|
suggest: () => ({
|
|
70
|
-
suggestion: 'A compile error occurred. Run `rego_check` for the structured diagnostic
|
|
70
|
+
suggestion: 'A compile error occurred. Run `rego_check` for the structured diagnostic -- the message text usually points at the precise issue (often an unresolved import or capabilities mismatch).',
|
|
71
71
|
confidence: 'low',
|
|
72
72
|
}),
|
|
73
73
|
},
|
|
@@ -75,7 +75,7 @@ const KNOWN_FIXES = [
|
|
|
75
75
|
{
|
|
76
76
|
match: (code) => code === 'print-or-trace-call',
|
|
77
77
|
suggest: () => ({
|
|
78
|
-
suggestion: 'Remove the `print(...)` or `trace(...)` call before shipping
|
|
78
|
+
suggestion: 'Remove the `print(...)` or `trace(...)` call before shipping -- it slows evaluation and is rarely intended in production policy.',
|
|
79
79
|
confidence: 'high',
|
|
80
80
|
}),
|
|
81
81
|
},
|
|
@@ -108,7 +108,7 @@ export function registerRegoSuggestFix(server, config) {
|
|
|
108
108
|
return {
|
|
109
109
|
code,
|
|
110
110
|
message: diag.message,
|
|
111
|
-
suggestion: 'No automated suggestion available for this diagnostic. Read the message text and the location for context
|
|
111
|
+
suggestion: 'No automated suggestion available for this diagnostic. Read the message text and the location for context -- most Rego errors have an obvious mechanical fix once the trigger is identified.',
|
|
112
112
|
confidence: 'low',
|
|
113
113
|
};
|
|
114
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest-fix.js","sourceRoot":"","sources":["../../../src/tools/helpers/suggest-fix.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,mBAAmB,GAAG;IAC1B,WAAW,EAAE,CAAC;SACX,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC5E,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACnD,QAAQ,EAAE,CAAC;aACR,MAAM,CAAC;YACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC3B,CAAC;aACD,QAAQ,EAAE;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAClE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;KACzE,CAAC,CACH;SACA,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,2CAA2C,CAAC;CACzD,CAAC;AAUF,MAAM,WAAW,GAGZ;IACH;QACE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,uBAAuB;QACjD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO;gBACL,UAAU,EAAE,OAAO;oBACjB,CAAC,CAAC,kBAAkB,OAAO,iIAAiI;oBAC5J,CAAC,CAAC,6FAA6F;gBACjG,UAAU,EAAE,MAAM;aACnB,CAAC;QACJ,CAAC;KACF;IACD;QACE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,kBAAkB;QAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;YACd,UAAU,EACR,+HAA+H;YACjI,UAAU,EAAE,QAAQ;SACrB,CAAC;KACH;IACD;QACE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,iBAAiB;QAC3C,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrB,UAAU,EAAE,kBAAkB,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"suggest-fix.js","sourceRoot":"","sources":["../../../src/tools/helpers/suggest-fix.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -6,24 +6,27 @@
|
|
|
6
6
|
* declaration site tidy.
|
|
7
7
|
*
|
|
8
8
|
* Tools planned (see SPEC.md / per-tool docs):
|
|
9
|
-
* Category A
|
|
9
|
+
* Category A -- Authoring: rego_format, rego_check, rego_lint,
|
|
10
10
|
* rego_parse_ast, rego_inspect,
|
|
11
11
|
* rego_capabilities, rego_deps
|
|
12
|
-
* Category B
|
|
12
|
+
* Category B -- Evaluation: rego_eval, rego_eval_with_explain,
|
|
13
13
|
* rego_eval_with_profile,
|
|
14
14
|
* rego_eval_with_coverage, rego_test,
|
|
15
15
|
* rego_bench, rego_compile_query
|
|
16
|
-
* Category C
|
|
17
|
-
* Category D
|
|
16
|
+
* Category C -- Bundles: opa_bundle_build, opa_bundle_sign
|
|
17
|
+
* Category D -- Server mgmt: opa_list_policies, opa_get_policy,
|
|
18
18
|
* opa_put_policy, opa_delete_policy,
|
|
19
19
|
* opa_get_data, opa_put_data,
|
|
20
20
|
* opa_patch_data, opa_query_decision,
|
|
21
21
|
* opa_compile_query, opa_health,
|
|
22
22
|
* opa_status, opa_config
|
|
23
|
-
* Category E
|
|
23
|
+
* Category E -- Helpers: rego_explain_decision,
|
|
24
24
|
* rego_generate_test_skeleton,
|
|
25
25
|
* rego_describe_policy,
|
|
26
|
-
* rego_suggest_fix
|
|
26
|
+
* rego_suggest_fix,
|
|
27
|
+
* rego_coverage_gaps,
|
|
28
|
+
* rego_security_audit
|
|
29
|
+
* Category F -- Meta: mcp_server_info
|
|
27
30
|
*/
|
|
28
31
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
29
32
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { registerAuthoringTools } from './authoring/index.js';
|
|
|
2
2
|
import { registerBundleTools } from './bundles/index.js';
|
|
3
3
|
import { registerEvaluationTools } from './evaluation/index.js';
|
|
4
4
|
import { registerHelperTools } from './helpers/index.js';
|
|
5
|
+
import { registerMetaTools } from './meta/index.js';
|
|
5
6
|
import { registerServerManagementTools } from './server-management/index.js';
|
|
6
7
|
export function registerTools(server, config) {
|
|
7
8
|
registerAuthoringTools(server, config);
|
|
@@ -9,5 +10,6 @@ export function registerTools(server, config) {
|
|
|
9
10
|
registerBundleTools(server, config);
|
|
10
11
|
registerServerManagementTools(server, config);
|
|
11
12
|
registerHelperTools(server, config);
|
|
13
|
+
registerMetaTools(server, config);
|
|
12
14
|
}
|
|
13
15
|
//# 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":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Category F -- Meta / server info.
|
|
3
|
+
*
|
|
4
|
+
* Tools that expose information about the MCP server itself rather than
|
|
5
|
+
* the OPA runtime or Rego policies.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import type { Config } from '../../config.js';
|
|
9
|
+
export declare function registerMetaTools(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/meta/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAG9C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/meta/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAc;IACjE,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `mcp_server_info` -- return version and runtime info for this MCP
|
|
3
|
+
* server instance so a connected LLM can answer "what version am I on"
|
|
4
|
+
* without inspecting the initialize handshake directly.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
import type { Config } from '../../config.js';
|
|
8
|
+
export interface McpServerInfoOutput {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string;
|
|
11
|
+
opaVersion: string | null;
|
|
12
|
+
regalVersion: string | null;
|
|
13
|
+
transport: 'stdio';
|
|
14
|
+
node: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function registerMcpServerInfo(server: McpServer, config: Config): void;
|
|
17
|
+
//# sourceMappingURL=server-info.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-info.d.ts","sourceRoot":"","sources":["../../../src/tools/meta/server-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8B7E"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { SERVER_NAME, SERVER_VERSION } from '../../constants.js';
|
|
2
|
+
import { ok } from '../../lib/errors.js';
|
|
3
|
+
import { OpaCli } from '../../lib/opa-cli.js';
|
|
4
|
+
import { RegalCli } from '../../lib/regal-cli.js';
|
|
5
|
+
import { withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
6
|
+
export function registerMcpServerInfo(server, config) {
|
|
7
|
+
const opa = new OpaCli(config);
|
|
8
|
+
const regal = new RegalCli(config);
|
|
9
|
+
server.registerTool('mcp_server_info', {
|
|
10
|
+
title: 'MCP server info',
|
|
11
|
+
description: 'Return the name, version, and runtime details of this opa-mcp server instance. Use this when you need to confirm which version of opa-mcp is running, or to verify that the OPA and Regal binaries are reachable.',
|
|
12
|
+
inputSchema: {},
|
|
13
|
+
}, async () => {
|
|
14
|
+
return withToolEnvelope(config, async () => {
|
|
15
|
+
const [opaVersion, regalVersion] = await Promise.all([
|
|
16
|
+
opa.version().catch(() => null),
|
|
17
|
+
regal.version().catch(() => null),
|
|
18
|
+
]);
|
|
19
|
+
return ok({
|
|
20
|
+
name: SERVER_NAME,
|
|
21
|
+
version: SERVER_VERSION,
|
|
22
|
+
opaVersion,
|
|
23
|
+
regalVersion,
|
|
24
|
+
transport: 'stdio',
|
|
25
|
+
node: process.version,
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=server-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-info.js","sourceRoot":"","sources":["../../../src/tools/meta/server-info.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAW7D,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAc;IACrE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,mNAAmN;QACrN,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,OAAO,gBAAgB,CAAsB,MAAM,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACnD,GAAG,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAC/B,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YAEH,OAAO,EAAE,CAAsB;gBAC7B,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,cAAc;gBACvB,UAAU;gBACV,YAAY;gBACZ,SAAS,EAAE,OAAO;gBAClB,IAAI,EAAE,OAAO,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC"}
|