@orygn/opa-mcp 0.4.0 → 0.5.0

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.
Files changed (146) hide show
  1. package/CHANGELOG.md +339 -3
  2. package/README.md +71 -72
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +8 -3
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +1 -1
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +57 -15
  9. package/dist/config.js.map +1 -1
  10. package/dist/lib/bundle-signatures.d.ts +23 -0
  11. package/dist/lib/bundle-signatures.d.ts.map +1 -0
  12. package/dist/lib/bundle-signatures.js +152 -0
  13. package/dist/lib/bundle-signatures.js.map +1 -0
  14. package/dist/lib/child-env.d.ts +9 -2
  15. package/dist/lib/child-env.d.ts.map +1 -1
  16. package/dist/lib/child-env.js +38 -6
  17. package/dist/lib/child-env.js.map +1 -1
  18. package/dist/lib/conftest-cli.d.ts +25 -10
  19. package/dist/lib/conftest-cli.d.ts.map +1 -1
  20. package/dist/lib/conftest-cli.js +152 -33
  21. package/dist/lib/conftest-cli.js.map +1 -1
  22. package/dist/lib/install-id.d.ts.map +1 -1
  23. package/dist/lib/install-id.js +18 -3
  24. package/dist/lib/install-id.js.map +1 -1
  25. package/dist/lib/json-stream.d.ts +26 -0
  26. package/dist/lib/json-stream.d.ts.map +1 -0
  27. package/dist/lib/json-stream.js +69 -0
  28. package/dist/lib/json-stream.js.map +1 -0
  29. package/dist/lib/opa-cli.d.ts +64 -16
  30. package/dist/lib/opa-cli.d.ts.map +1 -1
  31. package/dist/lib/opa-cli.js +98 -28
  32. package/dist/lib/opa-cli.js.map +1 -1
  33. package/dist/lib/opa-paths.d.ts +24 -0
  34. package/dist/lib/opa-paths.d.ts.map +1 -0
  35. package/dist/lib/opa-paths.js +97 -0
  36. package/dist/lib/opa-paths.js.map +1 -0
  37. package/dist/lib/regal-cli.d.ts +16 -1
  38. package/dist/lib/regal-cli.d.ts.map +1 -1
  39. package/dist/lib/regal-cli.js +40 -6
  40. package/dist/lib/regal-cli.js.map +1 -1
  41. package/dist/lib/rego-ast-walker.d.ts.map +1 -1
  42. package/dist/lib/rego-ast-walker.js +141 -17
  43. package/dist/lib/rego-ast-walker.js.map +1 -1
  44. package/dist/lib/rego-counterexample.d.ts +1 -1
  45. package/dist/lib/rego-counterexample.d.ts.map +1 -1
  46. package/dist/lib/rego-counterexample.js +23 -5
  47. package/dist/lib/rego-counterexample.js.map +1 -1
  48. package/dist/lib/rego-ir.d.ts +32 -2
  49. package/dist/lib/rego-ir.d.ts.map +1 -1
  50. package/dist/lib/rego-smt-encoder.d.ts +53 -5
  51. package/dist/lib/rego-smt-encoder.d.ts.map +1 -1
  52. package/dist/lib/rego-smt-encoder.js +192 -26
  53. package/dist/lib/rego-smt-encoder.js.map +1 -1
  54. package/dist/lib/rego-type-inferencer.d.ts +1 -1
  55. package/dist/lib/rego-type-inferencer.d.ts.map +1 -1
  56. package/dist/lib/rego-type-inferencer.js +3 -3
  57. package/dist/lib/rego-type-inferencer.js.map +1 -1
  58. package/dist/lib/rego-verify-engine.d.ts.map +1 -1
  59. package/dist/lib/rego-verify-engine.js +109 -77
  60. package/dist/lib/rego-verify-engine.js.map +1 -1
  61. package/dist/lib/rego-z3.d.ts +10 -0
  62. package/dist/lib/rego-z3.d.ts.map +1 -1
  63. package/dist/lib/rego-z3.js +38 -0
  64. package/dist/lib/rego-z3.js.map +1 -1
  65. package/dist/lib/security.d.ts +8 -0
  66. package/dist/lib/security.d.ts.map +1 -1
  67. package/dist/lib/security.js +130 -54
  68. package/dist/lib/security.js.map +1 -1
  69. package/dist/resources/patterns.d.ts +1 -1
  70. package/dist/resources/patterns.d.ts.map +1 -1
  71. package/dist/resources/patterns.js +40 -12
  72. package/dist/resources/patterns.js.map +1 -1
  73. package/dist/server.d.ts.map +1 -1
  74. package/dist/server.js +10 -2
  75. package/dist/server.js.map +1 -1
  76. package/dist/tools/bundles/build.d.ts.map +1 -1
  77. package/dist/tools/bundles/build.js +12 -4
  78. package/dist/tools/bundles/build.js.map +1 -1
  79. package/dist/tools/bundles/sign.d.ts +9 -2
  80. package/dist/tools/bundles/sign.d.ts.map +1 -1
  81. package/dist/tools/bundles/sign.js +145 -19
  82. package/dist/tools/bundles/sign.js.map +1 -1
  83. package/dist/tools/bundles/verify.d.ts +1 -1
  84. package/dist/tools/bundles/verify.d.ts.map +1 -1
  85. package/dist/tools/bundles/verify.js +58 -19
  86. package/dist/tools/bundles/verify.js.map +1 -1
  87. package/dist/tools/conftest/pull.d.ts.map +1 -1
  88. package/dist/tools/conftest/pull.js +24 -10
  89. package/dist/tools/conftest/pull.js.map +1 -1
  90. package/dist/tools/conftest/push.d.ts.map +1 -1
  91. package/dist/tools/conftest/push.js +17 -7
  92. package/dist/tools/conftest/push.js.map +1 -1
  93. package/dist/tools/conftest/test.d.ts +10 -6
  94. package/dist/tools/conftest/test.d.ts.map +1 -1
  95. package/dist/tools/conftest/test.js +47 -24
  96. package/dist/tools/conftest/test.js.map +1 -1
  97. package/dist/tools/conftest/verify.d.ts +10 -6
  98. package/dist/tools/conftest/verify.d.ts.map +1 -1
  99. package/dist/tools/conftest/verify.js +30 -18
  100. package/dist/tools/conftest/verify.js.map +1 -1
  101. package/dist/tools/evaluation/bench.d.ts +16 -0
  102. package/dist/tools/evaluation/bench.d.ts.map +1 -1
  103. package/dist/tools/evaluation/bench.js +30 -5
  104. package/dist/tools/evaluation/bench.js.map +1 -1
  105. package/dist/tools/evaluation/exec.d.ts +16 -0
  106. package/dist/tools/evaluation/exec.d.ts.map +1 -1
  107. package/dist/tools/evaluation/exec.js +35 -2
  108. package/dist/tools/evaluation/exec.js.map +1 -1
  109. package/dist/tools/evaluation/test-multiroot.d.ts +4 -0
  110. package/dist/tools/evaluation/test-multiroot.d.ts.map +1 -1
  111. package/dist/tools/evaluation/test-multiroot.js +12 -2
  112. package/dist/tools/evaluation/test-multiroot.js.map +1 -1
  113. package/dist/tools/evaluation/test.d.ts +45 -0
  114. package/dist/tools/evaluation/test.d.ts.map +1 -1
  115. package/dist/tools/evaluation/test.js +146 -27
  116. package/dist/tools/evaluation/test.js.map +1 -1
  117. package/dist/tools/helpers/coverage-gaps.d.ts +11 -3
  118. package/dist/tools/helpers/coverage-gaps.d.ts.map +1 -1
  119. package/dist/tools/helpers/coverage-gaps.js +4 -3
  120. package/dist/tools/helpers/coverage-gaps.js.map +1 -1
  121. package/dist/tools/helpers/explain-undefined.d.ts +9 -3
  122. package/dist/tools/helpers/explain-undefined.d.ts.map +1 -1
  123. package/dist/tools/helpers/explain-undefined.js +83 -51
  124. package/dist/tools/helpers/explain-undefined.js.map +1 -1
  125. package/dist/tools/helpers/verify.d.ts.map +1 -1
  126. package/dist/tools/helpers/verify.js +5 -1
  127. package/dist/tools/helpers/verify.js.map +1 -1
  128. package/dist/tools/server-management/_shared.d.ts +15 -4
  129. package/dist/tools/server-management/_shared.d.ts.map +1 -1
  130. package/dist/tools/server-management/_shared.js +73 -12
  131. package/dist/tools/server-management/_shared.js.map +1 -1
  132. package/dist/tools/server-management/data.d.ts.map +1 -1
  133. package/dist/tools/server-management/data.js +88 -23
  134. package/dist/tools/server-management/data.js.map +1 -1
  135. package/dist/tools/server-management/decisions.d.ts.map +1 -1
  136. package/dist/tools/server-management/decisions.js +16 -3
  137. package/dist/tools/server-management/decisions.js.map +1 -1
  138. package/dist/tools/server-management/policies.d.ts.map +1 -1
  139. package/dist/tools/server-management/policies.js +44 -7
  140. package/dist/tools/server-management/policies.js.map +1 -1
  141. package/dist/tools/server-management/status.d.ts.map +1 -1
  142. package/dist/tools/server-management/status.js +80 -13
  143. package/dist/tools/server-management/status.js.map +1 -1
  144. package/dist/types.d.ts +9 -0
  145. package/dist/types.d.ts.map +1 -1
  146. package/package.json +2 -1
@@ -7,19 +7,46 @@ import { OpaClient } from '../../lib/opa-client.js';
7
7
  import { ok } from '../../lib/errors.js';
8
8
  import { withToolEnvelope } from '../../lib/tool-helpers.js';
9
9
  import { mapOpaClientError } from './_shared.js';
10
+ /**
11
+ * Drop the parts of a policy record the caller did not ask for.
12
+ *
13
+ * OPA answers the policy endpoints with the parsed AST alongside the source,
14
+ * and the AST is far larger than the text it came from: a 477-byte policy comes
15
+ * back as a 19 KB response once the envelope is indented. Returning it by
16
+ * default pushed a list of any real size past the response cap, and the cap's
17
+ * advice to narrow the scope was unfollowable because the list tool takes no
18
+ * arguments.
19
+ */
20
+ function trimPolicy(record, opts) {
21
+ const trimmed = { id: record.id };
22
+ if (opts.source && record.raw !== undefined)
23
+ trimmed.raw = record.raw;
24
+ if (opts.ast && record.ast !== undefined)
25
+ trimmed.ast = record.ast;
26
+ return trimmed;
27
+ }
10
28
  export function registerPolicyTools(server, config) {
11
29
  const opa = new OpaClient(config);
12
30
  server.registerTool('opa_list_policies', {
13
31
  title: 'List OPA policies',
14
- description: 'List policies registered on the running OPA server. Returns an array of `{ id, raw, ast }` records.',
15
- inputSchema: {},
32
+ description: 'List policies registered on the running OPA server. Returns the policy IDs and a count. Set `includeSource` for the Rego text of every policy, or `includeAst` for the parsed AST of every policy; both are off by default because either one pushes a list of any real size past the response cap.',
33
+ inputSchema: {
34
+ includeSource: z
35
+ .boolean()
36
+ .optional()
37
+ .describe("Include each policy's Rego source. Off by default: fetch one policy with `opa_get_policy` rather than every policy at once."),
38
+ includeAst: z
39
+ .boolean()
40
+ .optional()
41
+ .describe("Include each policy's parsed AST. Off by default; it is roughly forty times the size of the source and will exceed the response cap on all but the smallest servers."),
42
+ },
16
43
  annotations: {
17
44
  readOnlyHint: true,
18
45
  destructiveHint: false,
19
46
  idempotentHint: true,
20
47
  openWorldHint: true,
21
48
  },
22
- }, async (_input, { signal }) => {
49
+ }, async ({ includeSource, includeAst }, { signal }) => {
23
50
  return withToolEnvelope(config, async () => {
24
51
  try {
25
52
  const data = await opa.request({
@@ -27,7 +54,11 @@ export function registerPolicyTools(server, config) {
27
54
  path: '/v1/policies',
28
55
  signal,
29
56
  });
30
- return ok({ policies: data.result ?? [] });
57
+ const records = data.result ?? [];
58
+ return ok({
59
+ policies: records.map((r) => trimPolicy(r, { source: includeSource === true, ast: includeAst === true })),
60
+ count: records.length,
61
+ });
31
62
  }
32
63
  catch (e) {
33
64
  return mapOpaClientError(e);
@@ -36,9 +67,13 @@ export function registerPolicyTools(server, config) {
36
67
  });
37
68
  server.registerTool('opa_get_policy', {
38
69
  title: 'Get OPA policy by ID',
39
- description: 'Fetch a single policy by ID from the running OPA server.',
70
+ description: "Fetch a single policy by ID from the running OPA server. Returns the Rego source; the parsed AST is omitted unless asked for, since it is roughly forty times the size of the source it came from. Use `rego_parse_ast` on the source when an AST is what's wanted.",
40
71
  inputSchema: {
41
72
  id: z.string().min(1).describe('Policy ID, e.g. "rbac" or "policies/auth/main".'),
73
+ includeAst: z
74
+ .boolean()
75
+ .optional()
76
+ .describe("Include OPA's parsed AST alongside the source. Off by default."),
42
77
  },
43
78
  annotations: {
44
79
  readOnlyHint: true,
@@ -46,7 +81,7 @@ export function registerPolicyTools(server, config) {
46
81
  idempotentHint: true,
47
82
  openWorldHint: true,
48
83
  },
49
- }, async ({ id }, { signal }) => {
84
+ }, async ({ id, includeAst }, { signal }) => {
50
85
  return withToolEnvelope(config, async () => {
51
86
  try {
52
87
  const data = await opa.request({
@@ -54,7 +89,9 @@ export function registerPolicyTools(server, config) {
54
89
  path: `/v1/policies/${encodeURIComponent(id)}`,
55
90
  signal,
56
91
  });
57
- return ok({ policy: data.result });
92
+ return ok({
93
+ policy: trimPolicy(data.result, { source: true, ast: includeAst === true }),
94
+ });
58
95
  }
59
96
  catch (e) {
60
97
  return mapOpaClientError(e, 'POLICY_NOT_FOUND');
@@ -1 +1 @@
1
- {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAM9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA6G3E"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAuE9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkH3E"}
@@ -2,15 +2,77 @@
2
2
  * Server-status tools: opa_health, opa_status, opa_config.
3
3
  */
4
4
  import { z } from 'zod';
5
- import { OpaClient, OpaUnreachableError } from '../../lib/opa-client.js';
6
- import { err, ok } from '../../lib/errors.js';
5
+ import { OpaClient, OpaHttpError } from '../../lib/opa-client.js';
6
+ import { ok } from '../../lib/errors.js';
7
7
  import { withToolEnvelope } from '../../lib/tool-helpers.js';
8
8
  import { mapOpaClientError } from './_shared.js';
9
+ /** Stands in for a header value so the header is still visible as configured. */
10
+ const REDACTED = '<redacted by opa-mcp>';
11
+ /** OPA answers an unhealthy check with `{"error": "..."}`; surface that text. */
12
+ function healthReason(e) {
13
+ const body = e.body;
14
+ if (typeof body === 'string' && body.trim().length > 0) {
15
+ try {
16
+ const parsed = JSON.parse(body);
17
+ if (typeof parsed.error === 'string')
18
+ return parsed.error;
19
+ }
20
+ catch {
21
+ return body.trim();
22
+ }
23
+ return body.trim();
24
+ }
25
+ if (typeof body === 'object' && body !== null) {
26
+ const parsed = body;
27
+ if (typeof parsed.error === 'string')
28
+ return parsed.error;
29
+ }
30
+ return undefined;
31
+ }
32
+ /**
33
+ * Redact the values of `services.*.headers` in an OPA configuration document.
34
+ *
35
+ * OPA drops the `credentials` block from `GET /v1/config` but returns `headers`
36
+ * verbatim, and a header is the ordinary way to put an API key or a bearer token
37
+ * in an OPA config. Handing those to an agent, which is what these two tools do
38
+ * with the document, puts a live credential into a transcript. The header names
39
+ * survive, so the document still answers what the server is configured to send.
40
+ */
41
+ function redactServiceHeaders(document) {
42
+ if (typeof document !== 'object' || document === null || Array.isArray(document)) {
43
+ return document;
44
+ }
45
+ const doc = document;
46
+ const services = doc['services'];
47
+ if (typeof services !== 'object' || services === null || Array.isArray(services)) {
48
+ return document;
49
+ }
50
+ let touched = false;
51
+ const redactedServices = {};
52
+ for (const [name, service] of Object.entries(services)) {
53
+ if (typeof service !== 'object' || service === null || Array.isArray(service)) {
54
+ redactedServices[name] = service;
55
+ continue;
56
+ }
57
+ const entry = service;
58
+ const headers = entry['headers'];
59
+ if (typeof headers !== 'object' || headers === null || Array.isArray(headers)) {
60
+ redactedServices[name] = service;
61
+ continue;
62
+ }
63
+ touched = true;
64
+ redactedServices[name] = {
65
+ ...entry,
66
+ headers: Object.fromEntries(Object.keys(headers).map((k) => [k, REDACTED])),
67
+ };
68
+ }
69
+ return touched ? { ...doc, services: redactedServices } : document;
70
+ }
9
71
  export function registerStatusTools(server, config) {
10
72
  const opa = new OpaClient(config);
11
73
  server.registerTool('opa_health', {
12
74
  title: 'OPA health check',
13
- description: 'Hit the OPA `/health` endpoint. Returns `{ healthy: true }` on 200. Supports `bundles` and `plugins` query flags to require those subsystems to also be healthy.',
75
+ description: "Hit the OPA `/health` endpoint. A server that answers reports `{ healthy: true }` on 200 and `{ healthy: false }` with OPA's own reason otherwise, so an unactivated bundle is a health result rather than a tool error. `OPA_UNREACHABLE` means the server could not be reached at all. Supports `bundles` and `plugins` query flags to require those subsystems to also be healthy.",
14
76
  inputSchema: {
15
77
  bundles: z.boolean().optional().describe('Require bundle plugin to be healthy as well.'),
16
78
  plugins: z.boolean().optional().describe('Require all plugins to be healthy.'),
@@ -38,13 +100,16 @@ export function registerStatusTools(server, config) {
38
100
  return ok({ healthy: true });
39
101
  }
40
102
  catch (e) {
41
- if (e instanceof OpaUnreachableError) {
42
- return mapOpaClientError(e);
103
+ // A server that answered is reachable. Reporting an unactivated
104
+ // bundle as OPA_UNREACHABLE told the caller to go start a server that
105
+ // was already running, and buried OPA's own reason in a stringified
106
+ // error. Authentication is its own failure, not a health result, and
107
+ // so is a server that could not be reached or a cancelled request.
108
+ if (e instanceof OpaHttpError && e.status !== 401) {
109
+ const reason = healthReason(e);
110
+ return ok({ healthy: false, ...(reason !== undefined ? { reason } : {}) });
43
111
  }
44
- // Any non-2xx counts as unhealthy without raising.
45
- return err('OPA_UNREACHABLE', 'OPA reported unhealthy.', {
46
- details: { error: e instanceof Error ? e.message : String(e) },
47
- });
112
+ return mapOpaClientError(e);
48
113
  }
49
114
  });
50
115
  });
@@ -54,7 +119,9 @@ export function registerStatusTools(server, config) {
54
119
  'Returns the same underlying document as `opa_config` but presented under a `status` ' +
55
120
  'key as a convenience for agents that want to check "what is running" rather than ' +
56
121
  '"what was the server configured with". The response includes bundle settings, ' +
57
- 'decision-log settings, and plugin configuration as OPA reported them at startup.',
122
+ 'decision-log settings, and plugin configuration as OPA reported them at startup. ' +
123
+ 'Service header values are redacted, since OPA returns them verbatim and a header is ' +
124
+ 'the ordinary place to put an API key.',
58
125
  inputSchema: {},
59
126
  annotations: {
60
127
  readOnlyHint: true,
@@ -70,7 +137,7 @@ export function registerStatusTools(server, config) {
70
137
  path: '/v1/config',
71
138
  signal,
72
139
  });
73
- return ok({ status: data.result ?? data });
140
+ return ok({ status: redactServiceHeaders(data.result ?? data) });
74
141
  }
75
142
  catch (e) {
76
143
  return mapOpaClientError(e);
@@ -79,7 +146,7 @@ export function registerStatusTools(server, config) {
79
146
  });
80
147
  server.registerTool('opa_config', {
81
148
  title: 'OPA configuration',
82
- description: 'Return the running OPA server configuration (sanitized -- secrets are not included).',
149
+ description: 'Return the running OPA server configuration from `GET /v1/config`. OPA drops the `credentials` block but returns `services.*.headers` verbatim, which is the ordinary place to put an API key or a bearer token, so those values are redacted here and the header names kept.',
83
150
  inputSchema: {},
84
151
  annotations: {
85
152
  readOnlyHint: true,
@@ -95,7 +162,7 @@ export function registerStatusTools(server, config) {
95
162
  path: '/v1/config',
96
163
  signal,
97
164
  });
98
- return ok({ config: data.result ?? data });
165
+ return ok({ config: redactServiceHeaders(data.result ?? data) });
99
166
  }
100
167
  catch (e) {
101
168
  return mapOpaClientError(e);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,6 +2,15 @@
2
2
  * Shared types used across tools, prompts, and resources.
3
3
  */
4
4
  /** Standard error codes returned by tools. */
5
+ /**
6
+ * Codes a tool can return.
7
+ *
8
+ * Four names are reserved and currently unused: REGAL_VERSION_TOO_OLD (no
9
+ * minimum-version check exists), DEPENDENCY_CONFLICT, VERIFY_INCONCLUSIVE
10
+ * (rego_verify reports an inconclusive result as a verdict, not an error) and
11
+ * Z3_INIT_ERROR. They are kept so the union stays stable for consumers, and
12
+ * are no longer listed in the README as codes a caller can expect.
13
+ */
5
14
  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' | 'COVERAGE_BELOW_THRESHOLD' | 'OUTPUT_TOO_LARGE' | 'TIMEOUT' | 'CANCELLED' | 'VERIFY_INCONCLUSIVE' | 'Z3_INIT_ERROR' | 'OPA_VERSION_UNSUPPORTED' | 'GITHUB_TOKEN_MISSING' | 'GIST_CREATE_FAILED' | 'UNKNOWN_ERROR';
6
15
  /** Structured error payload. */
7
16
  export interface ToolError {
@@ -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,oBAAoB,GACpB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,SAAS,GACT,WAAW,GACX,qBAAqB,GACrB,eAAe,GACf,yBAAyB,GACzB,sBAAsB,GACtB,oBAAoB,GACpB,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;;;;;;;;GAQG;AACH,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,0BAA0B,GAC1B,kBAAkB,GAClB,SAAS,GACT,WAAW,GACX,qBAAqB,GACrB,eAAe,GACf,yBAAyB,GACzB,sBAAsB,GACtB,oBAAoB,GACpB,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.4.0",
3
+ "version": "0.5.0",
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",
@@ -59,6 +59,7 @@
59
59
  "test:watch": "vitest",
60
60
  "test:coverage": "vitest run --config vitest.coverage.config.ts --coverage",
61
61
  "test:integration": "vitest run --config vitest.integration.config.ts",
62
+ "verify:fuzz": "node scripts/verify-soundness-fuzz.mjs",
62
63
  "prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build",
63
64
  "clean": "rimraf dist coverage .vitest-cache",
64
65
  "bundle:fetch": "node scripts/fetch-opa-binaries.mjs",