@orygn/opa-mcp 0.1.20 → 0.2.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.
- package/CHANGELOG.md +16 -0
- package/README.md +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +7 -1
- 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/resolve-binary.d.ts +42 -0
- package/dist/lib/resolve-binary.d.ts.map +1 -0
- package/dist/lib/resolve-binary.js +131 -0
- package/dist/lib/resolve-binary.js.map +1 -0
- package/package.json +11 -2
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,22 @@ not part of the public surface and may change in minor releases.
|
|
|
17
17
|
|
|
18
18
|
## [Unreleased]
|
|
19
19
|
|
|
20
|
+
## [0.2.0] - 2026-06-13
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
|
|
24
|
+
- OPA is now bundled. The OPA binary ships as platform-specific optional
|
|
25
|
+
dependencies (`@orygn/opa-mcp-<platform>-<arch>`), so `npx @orygn/opa-mcp` runs
|
|
26
|
+
without installing OPA separately. npm downloads only the binary that matches
|
|
27
|
+
your operating system and CPU, so the install stays small. Pinned to OPA 0.69.0.
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- The `opa` binary is now resolved in this order: an explicit `OPA_BINARY` first,
|
|
32
|
+
then `opa` found on PATH, then the bundled binary. Setups that already have `opa`
|
|
33
|
+
on PATH keep working exactly as before; the bundled copy is only a fallback, so
|
|
34
|
+
no existing install changes behavior.
|
|
35
|
+
|
|
20
36
|
## [0.1.20] - 2026-06-03
|
|
21
37
|
|
|
22
38
|
### Added
|
package/README.md
CHANGED
|
@@ -22,7 +22,7 @@ environment.
|
|
|
22
22
|
+--------------------+ 52 tools +-----------------+ +---------------------+
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
> **Status:** v0.
|
|
25
|
+
> **Status:** v0.2.0. Tool surface, error codes, and
|
|
26
26
|
> environment variables follow [SemVer](https://semver.org/) from
|
|
27
27
|
> v0.1.0 forward.
|
|
28
28
|
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,YAAY;IAChB,wEAAwE;;IASxE,2EAA2E;;IAG3E,2DAA2D;;IAG3D,+DAA+D;;IAG/D,qEAAqE;;IAGrE,kEAAkE;;IAGlE,mDAAmD;;IAGnD;;;;;OAKG;;IAGH,uEAAuE;;IAGvE,qCAAqC;;IAGrC;;;;OAIG;;;;;;;;;;;;;;;;;;;;;;;;;;EAEH,CAAC;AAEH,MAAM,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAyBlD,wBAAgB,UAAU,IAAI,MAAM,CAqCnC"}
|
package/dist/config.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
import { tmpdir } from 'node:os';
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
import { z } from 'zod';
|
|
11
|
+
import { resolveOpaBinary } from './lib/resolve-binary.js';
|
|
11
12
|
const ConfigSchema = z.object({
|
|
12
13
|
/** Base URL of a running OPA server (used by `opa_*` runtime tools). */
|
|
13
14
|
opaUrl: z
|
|
@@ -96,6 +97,11 @@ export function loadConfig() {
|
|
|
96
97
|
console.error("Run 'opa-mcp --help' for configuration options.");
|
|
97
98
|
process.exit(2);
|
|
98
99
|
}
|
|
99
|
-
|
|
100
|
+
const config = parsed.data;
|
|
101
|
+
// Turn the configured binary name into a concrete path: an explicit
|
|
102
|
+
// OPA_BINARY is kept as-is, otherwise we prefer `opa` on PATH and fall
|
|
103
|
+
// back to the bundled platform binary. See lib/resolve-binary.ts.
|
|
104
|
+
config.opaBinary = resolveOpaBinary(config.opaBinary);
|
|
105
|
+
return config;
|
|
100
106
|
}
|
|
101
107
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,kBAAkB,CAAC;AAC3C,eAAO,MAAM,cAAc,UAAU,CAAC"}
|
package/dist/constants.js
CHANGED
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,eAAe,CAAC;AAC3C,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The bundled package name for a platform/arch pair, or `undefined` when
|
|
3
|
+
* that combination is not shipped (e.g. 32-bit, freebsd).
|
|
4
|
+
*/
|
|
5
|
+
export declare function platformPackageName(platform: string, arch: string): string | undefined;
|
|
6
|
+
/**
|
|
7
|
+
* True when `bin` resolves to a file on PATH. Inputs are injectable so the
|
|
8
|
+
* scan can be exercised deterministically across platforms in tests.
|
|
9
|
+
*
|
|
10
|
+
* On win32 each PATHEXT extension is tried (matching the OS), and
|
|
11
|
+
* surrounding double quotes are stripped from PATH entries (Windows
|
|
12
|
+
* permits quoted directories, which the loader unquotes but a naive split
|
|
13
|
+
* would not).
|
|
14
|
+
*/
|
|
15
|
+
export declare function binOnPath(bin: string, opts?: {
|
|
16
|
+
platform?: string;
|
|
17
|
+
pathEnv?: string;
|
|
18
|
+
pathExt?: string;
|
|
19
|
+
}): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Absolute path to the bundled `opa` binary for the given platform/arch,
|
|
22
|
+
* or `undefined` when the optional dependency is not installed, the
|
|
23
|
+
* platform is unsupported, or the file is missing.
|
|
24
|
+
*
|
|
25
|
+
* On non-Windows platforms the file is checked for the execute bit and
|
|
26
|
+
* `chmod`ed to 0o755 if a package manager dropped it (npm preserves the
|
|
27
|
+
* bit, but pnpm/Yarn occasionally do not). The chmod is best-effort: if it
|
|
28
|
+
* fails the path is still returned so the spawn produces a clear error.
|
|
29
|
+
*/
|
|
30
|
+
export declare function bundledOpaPath(platform?: string, arch?: string): string | undefined;
|
|
31
|
+
/** Injectable probes for {@link resolveOpaBinary}, for deterministic tests. */
|
|
32
|
+
export interface ResolveBinaryDeps {
|
|
33
|
+
onPath?: (bin: string) => boolean;
|
|
34
|
+
bundled?: () => string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decide which `opa` binary to spawn. See the module header for the full
|
|
38
|
+
* resolution order. `configured` is the value from `OPA_BINARY` (or the
|
|
39
|
+
* `'opa'` default). Never throws.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveOpaBinary(configured: string, deps?: ResolveBinaryDeps): string;
|
|
42
|
+
//# sourceMappingURL=resolve-binary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-binary.d.ts","sourceRoot":"","sources":["../../src/lib/resolve-binary.ts"],"names":[],"mappings":"AA6CA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEtF;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,OAAO,CAkBT;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,GAAE,MAAyB,EACnC,IAAI,GAAE,MAAqB,GAC1B,MAAM,GAAG,SAAS,CAyBpB;AAED,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,MAAM,CAQzF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves which `opa` binary the server should spawn.
|
|
3
|
+
*
|
|
4
|
+
* The server ships the OPA binary as platform-specific optional
|
|
5
|
+
* dependencies (`@orygn/opa-mcp-<platform>-<arch>`), following the same
|
|
6
|
+
* model esbuild and @swc use. npm installs only the package matching the
|
|
7
|
+
* host's `os`/`cpu`, so the right binary lands in `node_modules` with no
|
|
8
|
+
* postinstall download.
|
|
9
|
+
*
|
|
10
|
+
* Resolution order, highest priority first:
|
|
11
|
+
* 1. An explicit `OPA_BINARY` (anything other than the bare default
|
|
12
|
+
* `'opa'`) is returned verbatim. The operator's choice always wins.
|
|
13
|
+
* 2. `opa` already on PATH is used as-is, preserving the exact behavior
|
|
14
|
+
* of every install that predates bundling. No version is swapped out
|
|
15
|
+
* from under an existing user.
|
|
16
|
+
* 3. The bundled optional-dependency binary, if installed.
|
|
17
|
+
* 4. Falls back to the literal `'opa'`, so a missing binary surfaces the
|
|
18
|
+
* same `OPA_BINARY_NOT_FOUND` install hint as before.
|
|
19
|
+
*
|
|
20
|
+
* This function never throws: every filesystem and module-resolution
|
|
21
|
+
* failure degrades to returning `'opa'`.
|
|
22
|
+
*
|
|
23
|
+
* Note on the PATH scan (step 2): it mirrors how the OS resolves a bare
|
|
24
|
+
* command name, but is not guaranteed bit-identical to the platform's
|
|
25
|
+
* loader in every edge case. While no platform packages are published it
|
|
26
|
+
* is moot -- `bundledOpaPath()` returns undefined, so the resolver can
|
|
27
|
+
* only ever return `'opa'`. Scan fidelity becomes load-bearing once the
|
|
28
|
+
* platform packages ship, and is validated by the cross-platform CI
|
|
29
|
+
* matrix before that point.
|
|
30
|
+
*/
|
|
31
|
+
import { accessSync, chmodSync, constants, existsSync } from 'node:fs';
|
|
32
|
+
import { createRequire } from 'node:module';
|
|
33
|
+
import { delimiter, dirname, join } from 'node:path';
|
|
34
|
+
const nodeRequire = createRequire(import.meta.url);
|
|
35
|
+
/** Optional-dependency package name keyed by `${platform}-${arch}`. */
|
|
36
|
+
const PLATFORM_PACKAGES = {
|
|
37
|
+
'linux-x64': '@orygn/opa-mcp-linux-x64',
|
|
38
|
+
'linux-arm64': '@orygn/opa-mcp-linux-arm64',
|
|
39
|
+
'darwin-x64': '@orygn/opa-mcp-darwin-x64',
|
|
40
|
+
'darwin-arm64': '@orygn/opa-mcp-darwin-arm64',
|
|
41
|
+
'win32-x64': '@orygn/opa-mcp-win32-x64',
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* The bundled package name for a platform/arch pair, or `undefined` when
|
|
45
|
+
* that combination is not shipped (e.g. 32-bit, freebsd).
|
|
46
|
+
*/
|
|
47
|
+
export function platformPackageName(platform, arch) {
|
|
48
|
+
return PLATFORM_PACKAGES[`${platform}-${arch}`];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* True when `bin` resolves to a file on PATH. Inputs are injectable so the
|
|
52
|
+
* scan can be exercised deterministically across platforms in tests.
|
|
53
|
+
*
|
|
54
|
+
* On win32 each PATHEXT extension is tried (matching the OS), and
|
|
55
|
+
* surrounding double quotes are stripped from PATH entries (Windows
|
|
56
|
+
* permits quoted directories, which the loader unquotes but a naive split
|
|
57
|
+
* would not).
|
|
58
|
+
*/
|
|
59
|
+
export function binOnPath(bin, opts = {}) {
|
|
60
|
+
const platform = opts.platform ?? process.platform;
|
|
61
|
+
const pathEnv = opts.pathEnv ?? process.env['PATH'] ?? '';
|
|
62
|
+
const exts = platform === 'win32'
|
|
63
|
+
? (opts.pathExt ?? process.env['PATHEXT'] ?? '.EXE;.CMD;.BAT')
|
|
64
|
+
.split(';')
|
|
65
|
+
.map((e) => e.toLowerCase())
|
|
66
|
+
: [''];
|
|
67
|
+
for (const rawDir of pathEnv.split(delimiter)) {
|
|
68
|
+
const dir = rawDir.replace(/^"(.*)"$/, '$1');
|
|
69
|
+
if (!dir)
|
|
70
|
+
continue;
|
|
71
|
+
for (const ext of exts) {
|
|
72
|
+
if (existsSync(join(dir, bin + ext)))
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Absolute path to the bundled `opa` binary for the given platform/arch,
|
|
80
|
+
* or `undefined` when the optional dependency is not installed, the
|
|
81
|
+
* platform is unsupported, or the file is missing.
|
|
82
|
+
*
|
|
83
|
+
* On non-Windows platforms the file is checked for the execute bit and
|
|
84
|
+
* `chmod`ed to 0o755 if a package manager dropped it (npm preserves the
|
|
85
|
+
* bit, but pnpm/Yarn occasionally do not). The chmod is best-effort: if it
|
|
86
|
+
* fails the path is still returned so the spawn produces a clear error.
|
|
87
|
+
*/
|
|
88
|
+
export function bundledOpaPath(platform = process.platform, arch = process.arch) {
|
|
89
|
+
const pkg = platformPackageName(platform, arch);
|
|
90
|
+
if (!pkg)
|
|
91
|
+
return undefined;
|
|
92
|
+
const binName = platform === 'win32' ? 'opa.exe' : 'opa';
|
|
93
|
+
let file;
|
|
94
|
+
try {
|
|
95
|
+
file = join(dirname(nodeRequire.resolve(`${pkg}/package.json`)), binName);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return undefined; // optional dependency not installed
|
|
99
|
+
}
|
|
100
|
+
if (!existsSync(file))
|
|
101
|
+
return undefined;
|
|
102
|
+
if (platform !== 'win32') {
|
|
103
|
+
try {
|
|
104
|
+
accessSync(file, constants.X_OK);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
try {
|
|
108
|
+
chmodSync(file, 0o755);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
/* best effort; an unusable binary will surface OPA_BINARY_NOT_FOUND on spawn */
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return file;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Decide which `opa` binary to spawn. See the module header for the full
|
|
119
|
+
* resolution order. `configured` is the value from `OPA_BINARY` (or the
|
|
120
|
+
* `'opa'` default). Never throws.
|
|
121
|
+
*/
|
|
122
|
+
export function resolveOpaBinary(configured, deps = {}) {
|
|
123
|
+
if (configured !== 'opa')
|
|
124
|
+
return configured;
|
|
125
|
+
const onPath = deps.onPath ?? ((b) => binOnPath(b));
|
|
126
|
+
if (onPath('opa'))
|
|
127
|
+
return 'opa';
|
|
128
|
+
const bundled = deps.bundled ?? (() => bundledOpaPath());
|
|
129
|
+
return bundled() ?? 'opa';
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=resolve-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-binary.js","sourceRoot":"","sources":["../../src/lib/resolve-binary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAErD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEnD,uEAAuE;AACvE,MAAM,iBAAiB,GAA2B;IAChD,WAAW,EAAE,0BAA0B;IACvC,aAAa,EAAE,4BAA4B;IAC3C,YAAY,EAAE,2BAA2B;IACzC,cAAc,EAAE,6BAA6B;IAC7C,WAAW,EAAE,0BAA0B;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,OAAO,iBAAiB,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CACvB,GAAW,EACX,OAAkE,EAAE;IAEpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,IAAI,GACR,QAAQ,KAAK,OAAO;QAClB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,gBAAgB,CAAC;aACzD,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEX,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAC5B,WAAmB,OAAO,CAAC,QAAQ,EACnC,OAAe,OAAO,CAAC,IAAI;IAE3B,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACzD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,GAAG,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC,CAAC,oCAAoC;IACxD,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAExC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,gFAAgF;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAQD;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,OAA0B,EAAE;IAC/E,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,UAAU,CAAC;IAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,IAAI,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,GAAuB,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,EAAE,IAAI,KAAK,CAAC;AAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orygn/opa-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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",
|
|
@@ -60,13 +60,22 @@
|
|
|
60
60
|
"test:coverage": "vitest run --config vitest.coverage.config.ts --coverage",
|
|
61
61
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
62
62
|
"prepublishOnly": "npm run lint && npm run typecheck && npm run test && npm run build",
|
|
63
|
-
"clean": "rimraf dist coverage .vitest-cache"
|
|
63
|
+
"clean": "rimraf dist coverage .vitest-cache",
|
|
64
|
+
"bundle:fetch": "node scripts/fetch-opa-binaries.mjs",
|
|
65
|
+
"bundle:sync": "node scripts/sync-versions.mjs"
|
|
64
66
|
},
|
|
65
67
|
"dependencies": {
|
|
66
68
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
67
69
|
"z3-solver": "^4.16.0",
|
|
68
70
|
"zod": "^3.23.0"
|
|
69
71
|
},
|
|
72
|
+
"optionalDependencies": {
|
|
73
|
+
"@orygn/opa-mcp-linux-x64": "0.2.0",
|
|
74
|
+
"@orygn/opa-mcp-linux-arm64": "0.2.0",
|
|
75
|
+
"@orygn/opa-mcp-darwin-x64": "0.2.0",
|
|
76
|
+
"@orygn/opa-mcp-darwin-arm64": "0.2.0",
|
|
77
|
+
"@orygn/opa-mcp-win32-x64": "0.2.0"
|
|
78
|
+
},
|
|
70
79
|
"devDependencies": {
|
|
71
80
|
"@eslint/js": "^10.0.1",
|
|
72
81
|
"@types/node": "^25.9.1",
|