From 185699db950f16b8248722a28d7ca7d8a765181c Mon Sep 17 00:00:00 2001 From: Thomas Winkler Date: Sat, 13 Jun 2026 07:55:34 +0200 Subject: [PATCH 1/2] Interception of rest request and simple elicitation workflow --- src/codemode/execute.ts | 94 +++++++++++++++++ src/tools/codemode.ts | 4 + src/tools/intercept.ts | 229 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 327 insertions(+) create mode 100644 src/tools/intercept.ts diff --git a/src/codemode/execute.ts b/src/codemode/execute.ts index d994398..6ab2f32 100644 --- a/src/codemode/execute.ts +++ b/src/codemode/execute.ts @@ -12,6 +12,7 @@ import type { AllowRule, RestrictionRule } from '../utils/restrictions' const QUERY_ENTRY_PATH = '/codemode-query.mjs' const EXECUTE_ENTRY_PATH = '/codemode-execute.mjs' +const DRY_RUN_ENTRY_PATH = '/codemode-dryrun.mjs' export const BLOCKED_REQUEST_PREFIX = 'Request blocked by MCP connection policy.' @@ -256,6 +257,99 @@ function buildCumulocityPreamble(tenantUrl: string): string { })()` } +// ───────────────────────────────────────────────────────────────────────── +// Dry-run interception +// ───────────────────────────────────────────────────────────────────────── + +export interface InterceptedOp { + method: string + path: string + body: unknown +} + +// Methods intercepted in dry-run (mocked — no real HTTP call). +// POST is included because upsert/action POSTs are common in Cumulocity (e.g. +// X-Upsert-Mode) and must not fire twice. The mock echoes the request body so +// compositions like `const r = await POST(...); use(r.id)` keep working. +// PATCH is included to keep the dry-run fully side-effect-free even when code +// mixes PATCH with other methods; approval is only required for POST/PUT/DELETE. +const DRY_RUN_INTERCEPT = new Set(['POST', 'PUT', 'PATCH', 'DELETE']) + +function createInterceptingFetch( + real: SafeFetchGlobal, + tenantUrl: string, + ops: InterceptedOp[], +): SafeFetchGlobal { + const base = tenantUrl.endsWith('/') ? tenantUrl.slice(0, -1) : tenantUrl + return { + kind: 'bridge-with-shim' as const, + shim: real.shim, + handler: async (...args: unknown[]) => { + const url = String(args[0] ?? '') + const init = (args[1] as Record | undefined) ?? {} + const method = String(init.method ?? 'GET').toUpperCase() + + if (DRY_RUN_INTERCEPT.has(method)) { + const path = url.startsWith(base) ? url.slice(base.length) : url + let body: unknown = null + const rawBody = init.body + if (typeof rawBody === 'string' && rawBody.length > 0) { + try { + body = JSON.parse(rawBody) + } catch { + body = rawBody + } + } + ops.push({ method, path, body }) + // Echo the request body so downstream composition code (e.g. + // `const r = await POST(...); r.description`) keeps working. + // DELETE → 204 No Content; POST → 201 Created; PUT/PATCH → 200 OK. + const mockBody = method === 'DELETE' ? null : (body ?? {}) + return { + status: method === 'DELETE' ? 204 : method === 'POST' ? 201 : 200, + statusText: method === 'DELETE' ? 'No Content' : method === 'POST' ? 'Created' : 'OK', + headers: {} as Record, + body: mockBody, + } + } + return real.handler(...args) + }, + } +} + +export async function dryRun(functionCode: string): Promise { + const auth = await resolveC8yAuth() + const authHeaders = createC8yAuthHeaders(auth) + const restrictions = c8yMcpServer.ctx.custom?.restrictions ?? [] + const allowRules = c8yMcpServer.ctx.custom?.allowRules ?? [] + + const ops: InterceptedOp[] = [] + const realFetch = createCumulocitySafeFetch(auth.tenantUrl, authHeaders, restrictions, allowRules) + + const functionExpression = normalizeCode(functionCode) + const code = [ + `const __mc8ypExecute = (${functionExpression});`, + 'if (typeof __mc8ypExecute !== "function") { throw new TypeError("Execute code must evaluate to a function.") }', + 'export default await __mc8ypExecute();', + ].join('\n') + + const globals: HostGlobals = { + __c8y_fetch: createInterceptingFetch(realFetch, auth.tenantUrl, ops), + cumulocity: buildCumulocityPreamble(auth.tenantUrl), + } + + const sandbox = await getSandbox() + // Ignore sandbox errors — partial captures are still useful. + await sandbox.run({ + code, + filename: DRY_RUN_ENTRY_PATH, + limits: SANDBOX_LIMITS, + globals, + }).catch(() => undefined) + + return ops +} + // ───────────────────────────────────────────────────────────────────────── // Public surface // ───────────────────────────────────────────────────────────────────────── diff --git a/src/tools/codemode.ts b/src/tools/codemode.ts index da5e5d4..3249fc0 100644 --- a/src/tools/codemode.ts +++ b/src/tools/codemode.ts @@ -2,6 +2,7 @@ import { defineTool } from 'tmcp/tool' import { tool } from 'tmcp/utils' import * as v from 'valibot' import { execute, query } from '../codemode/execute' +import { requireMutatingApproval } from './intercept' import type { Env } from '../types' function createCodeSchema(description: string) { @@ -149,6 +150,9 @@ async () => { }), }, async (input) => { try { + const blocked = await requireMutatingApproval(input.code) + if (blocked) + return tool.error(blocked) return tool.text(await execute(input.code)) } catch (error) { return tool.error(error instanceof Error ? error.message : String(error)) diff --git a/src/tools/intercept.ts b/src/tools/intercept.ts new file mode 100644 index 0000000..d388dc3 --- /dev/null +++ b/src/tools/intercept.ts @@ -0,0 +1,229 @@ +import * as v from 'valibot' +import { dryRun } from '../codemode/execute' +import type { InterceptedOp } from '../codemode/execute' +import { c8yMcpServer } from '../server-instance' + +// ───────────────────────────────────────────────────────────────────────── +// Mutating-operation summary for elicitation +// ───────────────────────────────────────────────────────────────────────── + +const MAX_INLINE_IDS = 5 +const MAX_BODY_FIELDS = 5 +const MAX_STRING_LEN = 60 + +function truncate(s: string): string { + return s.length > MAX_STRING_LEN ? `${s.slice(0, MAX_STRING_LEN)}…` : s +} + +function summarizeValue(val: unknown): string { + if (val === null || val === undefined) + return 'null' + if (typeof val === 'string') + return `"${truncate(val)}"` + if (typeof val === 'number' || typeof val === 'boolean') + return String(val) + if (Array.isArray(val)) + return `[${val.length} items]` + if (typeof val === 'object') + return `{${Object.keys(val as object).join(', ')}}` + return String(val) +} + +function bodyLines(body: unknown): string[] { + if (!body || typeof body !== 'object' || Array.isArray(body)) + return [] + const entries = Object.entries(body as Record) + const shown = entries.slice(0, MAX_BODY_FIELDS).map(([k, val]) => ` ${k}: ${summarizeValue(val)}`) + if (entries.length > MAX_BODY_FIELDS) + shown.push(` … (${entries.length - MAX_BODY_FIELDS} more fields)`) + return shown +} + +function canonicalize(path: string): { base: string, id: string | null } { + const [pathPart, qs] = path.split('?', 2) as [string, string | undefined] + const segments = pathPart.split('/') + const last = segments[segments.length - 1] ?? '' + const isId = /^\d+$/.test(last) || /^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/i.test(last) + if (isId) { + segments[segments.length - 1] = '{id}' + return { base: segments.join('/') + (qs != null ? `?${qs}` : ''), id: last } + } + return { base: path, id: null } +} + +function formatMutatingOpsSummary(ops: InterceptedOp[]): string { + const postCount = ops.filter((o) => o.method === 'POST').length + const putCount = ops.filter((o) => o.method === 'PUT').length + const delCount = ops.filter((o) => o.method === 'DELETE').length + const parts = [ + delCount > 0 ? `${delCount} DELETE` : '', + putCount > 0 ? `${putCount} PUT` : '', + postCount > 0 ? `${postCount} POST` : '', + ].filter(Boolean).join(', ') + + const lines: string[] = [ + `${ops.length} mutating API operation${ops.length !== 1 ? 's' : ''} detected (${parts}):`, + '', + ] + + interface Group { method: string, base: string, ids: string[], ops: InterceptedOp[] } + const groups = new Map() + for (const op of ops) { + const { base, id } = canonicalize(op.path) + const key = `${op.method}:${base}` + if (!groups.has(key)) + groups.set(key, { method: op.method, base, ids: [], ops: [] }) + const g = groups.get(key)! + if (id) + g.ids.push(id) + g.ops.push(op) + } + + for (const g of groups.values()) { + const first = g.ops[0] + if (!first) + continue + if (g.ops.length === 1) { + lines.push(`${g.method} ${first.path}`) + if (g.method !== 'DELETE') + lines.push(...bodyLines(first.body)) + } else { + lines.push(`${g.method} ${g.base} ×${g.ops.length}`) + if (g.ids.length > 0) { + const shown = g.ids.slice(0, MAX_INLINE_IDS) + const rest = g.ids.length - shown.length + lines.push(` IDs: ${shown.join(', ')}${rest > 0 ? ` … (+${rest} more)` : ''}`) + } + if (g.method !== 'DELETE') { + const sample = bodyLines(first.body) + if (sample.length > 0) { + lines.push(' Body (first operation):') + lines.push(...sample) + } + } + } + } + + return lines.join('\n') +} + +// ───────────────────────────────────────────────────────────────────────── +// OPA transaction plan (informational — not yet evaluated against a policy) +// ───────────────────────────────────────────────────────────────────────── + +interface OpaTransaction { + id: string + method: string + /** + * Exact path from the request, without query string. + */ + path: string + /** + * Path with numeric/UUID segments replaced by {id}. + */ + pathTemplate: string + /** + * Extracted resource ID, or null when path has no trailing ID segment. + */ + resourceId: string | null + /** + * Parsed query parameters, or null when none present. + */ + queryParams: Record | null + /** + * Parsed request body, or null for bodyless methods. + */ + body: unknown +} + +export interface OpaTransactionPlan { + input: { + principal: { tenant: string } + transactions: OpaTransaction[] + context: { tool: 'mc8yp-execute' } + } +} + +function buildOpaTransactionPlan(ops: InterceptedOp[], tenantUrl: string): OpaTransactionPlan { + return { + input: { + principal: { tenant: tenantUrl }, + transactions: ops.map((op, i) => { + const [pathPart, qs] = op.path.split('?', 2) as [string, string | undefined] + const { base, id: resourceId } = canonicalize(op.path) + const pathTemplate = base.split('?')[0] as string + const queryParams = qs + ? Object.fromEntries(new URLSearchParams(qs)) + : null + return { + id: `op-${i}`, + method: op.method, + path: pathPart, + pathTemplate, + resourceId, + queryParams, + body: op.body, + } + }), + context: { tool: 'mc8yp-execute' }, + }, + } +} + +// ───────────────────────────────────────────────────────────────────────── +// Elicitation workflow +// ───────────────────────────────────────────────────────────────────────── + +/** + * Runs a dry-run of the given code and, if POST/PUT/DELETE operations are + * detected, asks the user for approval via MCP elicitation. + * + * Returns null if execution should proceed, or an error string if blocked. + * @param code The JavaScript code to analyze, as a zero-parameter function expression. + * @param opa Whether to include the OPA transaction plan in the approval prompt (informational only, not yet evaluated against a real policy). + */ +export async function requireMutatingApproval(code: string, opa: boolean = false): Promise { + const ops = await dryRun(code) + const mutating = ops.filter((o) => o.method === 'POST' || o.method === 'PUT' || o.method === 'DELETE') + + if (mutating.length === 0) + return null + + const tenantUrl = c8yMcpServer.ctx.custom?.auth?.tenantUrl ?? '(unknown)' + const plan = buildOpaTransactionPlan(mutating, tenantUrl) + + const message = [ + formatMutatingOpsSummary(mutating), + ...(opa + ? [ + '', + '── OPA Transaction Plan (informational) ──', + JSON.stringify(plan, null, 2), + ] + : []), + ].join('\n') + + // v.optional allows undefined content when action is 'decline' or 'cancel', + // avoiding a spurious validation throw inside tmcp that would mask the real action. + const schema = v.optional(v.object({})) + + let approval + try { + approval = await c8yMcpServer.elicitation(message, schema) + } catch { + return ( + 'Execution blocked: mutating operations (POST/PUT/DELETE) require your approval, ' + + 'but the MCP client does not support elicitation. ' + + 'Use a client that supports MCP elicitation (e.g. Claude Desktop) to run mutating operations.' + ) + } + + if (approval.action === 'decline') + return 'Execution cancelled: you declined the approval prompt.' + if (approval.action === 'cancel') + return 'Execution cancelled: the approval prompt was dismissed.' + if (approval.action !== 'accept') + return 'Execution was not approved.' + + return null +} From 5c712da322fbd0468992a5e032c14edb18d58fce Mon Sep 17 00:00:00 2001 From: Thomas Winkler Date: Sat, 13 Jun 2026 14:11:51 +0200 Subject: [PATCH 2/2] Open Policy Agent based deny or elicit --- package.json | 3 +- pnpm-lock.yaml | 25 ++++++++ pnpm-workspace.yaml | 1 + policy.json | 21 +++++++ scripts/compile-policy.sh | 23 +++++++ src/cli/index.ts | 23 +++++++ src/policy/bundle.wasm | Bin 0 -> 354401 bytes src/policy/evaluate.ts | 49 +++++++++++++++ src/policy/index.ts | 4 ++ src/policy/rego/main.rego | 96 +++++++++++++++++++++++++++++ src/policy/transaction-plan.ts | 75 +++++++++++++++++++++++ src/tools/codemode.ts | 4 +- src/tools/intercept.ts | 107 ++++++++++----------------------- src/types/mcp-context.ts | 6 ++ tsdown.config.ts | 19 +++++- 15 files changed, 377 insertions(+), 79 deletions(-) create mode 100644 policy.json create mode 100755 scripts/compile-policy.sh create mode 100644 src/policy/bundle.wasm create mode 100644 src/policy/evaluate.ts create mode 100644 src/policy/index.ts create mode 100644 src/policy/rego/main.rego create mode 100644 src/policy/transaction-plan.ts diff --git a/package.json b/package.json index 4998dcd..a04b377 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,8 @@ }, "dependencies": { "@iso4/sandbox": "catalog:", - "@napi-rs/keyring": "catalog:" + "@napi-rs/keyring": "catalog:", + "@open-policy-agent/opa-wasm": "catalog:" }, "devDependencies": { "@c8y/client": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 869f0d2..8517b45 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ catalogs: '@napi-rs/keyring': specifier: ^1.3.0 version: 1.3.0 + '@open-policy-agent/opa-wasm': + specifier: ^1.10.0 + version: 1.10.0 '@schplitt/eslint-config': specifier: ^1.5.1 version: 1.5.1 @@ -89,6 +92,9 @@ importers: '@napi-rs/keyring': specifier: 'catalog:' version: 1.3.0 + '@open-policy-agent/opa-wasm': + specifier: 'catalog:' + version: 1.10.0 devDependencies: '@c8y/client': specifier: 'catalog:' @@ -753,6 +759,9 @@ packages: resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} engines: {node: ^20.17.0 || >=22.9.0} + '@open-policy-agent/opa-wasm@1.10.0': + resolution: {integrity: sha512-ymR/nFS3nO9o24j9xowGGQaf+Gmb813QcxUpVZkfRlJkawKWqSIllnEH15agyWjijmOIyhA+OBErenx6N3jphw==} + '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -3105,6 +3114,9 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + sqids@0.3.0: resolution: {integrity: sha512-lOQK1ucVg+W6n3FhRwwSeUijxe93b51Bfz5PMRMihVf1iVkl82ePQG7V5vwrhzB11v0NtsR25PSZRGiSomJaJw==} @@ -3512,6 +3524,10 @@ packages: resolution: {integrity: sha512-h0uDm97wvT2bokfwwTmY6kJ1hp6YDFL0nRHwNKz8s/VD1FH/vvZjAKoMUE+un0eaYBSG7/c6h+lJTP+31tjgTw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + yaml@1.10.3: + resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} + engines: {node: '>= 6'} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} @@ -4234,6 +4250,11 @@ snapshots: node-gyp: 12.4.0 proc-log: 6.1.0 + '@open-policy-agent/opa-wasm@1.10.0': + dependencies: + sprintf-js: 1.1.3 + yaml: 1.10.3 + '@ota-meshi/ast-token-store@0.3.0': {} '@oxc-project/types@0.133.0': {} @@ -6865,6 +6886,8 @@ snapshots: spdx-license-ids@3.0.23: {} + sprintf-js@1.1.3: {} + sqids@0.3.0: {} srvx@0.11.16: {} @@ -7221,6 +7244,8 @@ snapshots: eslint-visitor-keys: 5.0.1 yaml: 2.9.0 + yaml@1.10.3: {} + yaml@2.9.0: {} yargs-parser@22.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 228b1dc..5ab2d20 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -18,6 +18,7 @@ catalog: '@iso4/fetch': ^0.0.1 '@iso4/sandbox': ^0.0.3 '@napi-rs/keyring': ^1.3.0 + '@open-policy-agent/opa-wasm': ^1.10.0 '@schplitt/eslint-config': ^1.5.1 '@tmcp/adapter-valibot': ^0.1.6 '@tmcp/transport-http': ^0.8.6 diff --git a/policy.json b/policy.json new file mode 100644 index 0000000..0b382b1 --- /dev/null +++ b/policy.json @@ -0,0 +1,21 @@ +{ + "allowed_tenants": [ + "https://dtm-sb5.preprod.c8y.io" + ], + "path_policies": [ + { "action": "allow", "method": "GET", "path_glob": "/**" }, + { "action": "allow", "method": "POST", "path_glob": "/**" }, + { "action": "elicit", "method": "PUT", "path_glob": "/**" }, + { "action": "elicit", "method": "DELETE", "path_glob": "/**" } + ], + "limits": { + "max_deletes_per_transaction": 10 + }, + "restricted_body_fields": [ + "id", + "self", + "owner", + "lastUpdated", + "creationTime" + ] +} diff --git a/scripts/compile-policy.sh b/scripts/compile-policy.sh new file mode 100755 index 0000000..cdf052f --- /dev/null +++ b/scripts/compile-policy.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Recompile src/policy/bundle.wasm from src/policy/rego/main.rego. +# Requires opa CLI (https://www.openpolicyagent.org/docs/latest/#1-download-opa). +# Only needs to be run when the .rego source changes — the compiled artifact is +# committed to the repo so normal builds do not require opa to be installed. +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" +REGO_DIR="$PROJECT_ROOT/src/policy/rego" +OUT_WASM="$PROJECT_ROOT/src/policy/bundle.wasm" +TMP_BUNDLE="$(mktemp /tmp/mc8yp-policy-XXXXXX.tar.gz)" + +echo "Compiling OPA policy to WASM..." +opa build -t wasm -e mc8yp/transaction/decision -o "$TMP_BUNDLE" "$REGO_DIR" + +echo "Extracting policy.wasm..." +TMP_DIR="$(mktemp -d)" +tar -xzf "$TMP_BUNDLE" -C "$TMP_DIR" +cp "$TMP_DIR/policy.wasm" "$OUT_WASM" +rm -rf "$TMP_DIR" "$TMP_BUNDLE" + +echo "Done: $OUT_WASM ($(wc -c < "$OUT_WASM") bytes)" diff --git a/src/cli/index.ts b/src/cli/index.ts index 09baaa3..6ac92a0 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1,4 +1,6 @@ #!/usr/bin/env node +import { existsSync, readFileSync } from 'node:fs' +import { resolve } from 'node:path' import { StdioTransport } from '@tmcp/transport-stdio' import { defineCommand, runMain } from 'citty' import consola from 'consola' @@ -34,6 +36,11 @@ const main = defineCommand({ alias: 's', default: getCoreOpenApiVersion(), }, + policyData: { + type: 'string', + description: 'Path to an OPA data.json file. When supplied, OPA decides whether to allow, elicit, or deny mutating operations instead of always prompting.', + alias: ['p', 'policy-data'], + }, }, setup: () => { globalThis._getCredentialsByTenantUrl = getCredentialsByTenantUrl @@ -77,6 +84,21 @@ const main = defineCommand({ consola.info(`Applying ${parsedAllowRules.length} allow rule(s):`, parsedAllowRules.map((r) => r.source)) } + const rawPolicyData = Array.isArray(args.policyData) ? args.policyData.at(-1) : args.policyData + let policyDataPath: string | undefined + if (rawPolicyData) { + policyDataPath = resolve(rawPolicyData) + if (!existsSync(policyDataPath)) { + throw new Error(`--policy-data: file not found: ${policyDataPath}`) + } + try { + JSON.parse(readFileSync(policyDataPath, 'utf8')) + } catch { + throw new Error(`--policy-data: file is not valid JSON: ${policyDataPath}`) + } + consola.info(`OPA policy data loaded: ${policyDataPath}`) + } + // If a tenant was previously selected, populate the in-memory context now // so the first tool call is immediately ready — discovery cost is paid here // at startup, not deferred to the first tool call. @@ -119,6 +141,7 @@ const main = defineCommand({ // the agent cannot misuse this state for real calls. specs: active?.specs ?? getBundledOnlySpecs(), auth: active ? { tenantUrl: active.tenantUrl, authorizationHeader: active.authorizationHeader } : undefined, + policyDataPath, }) }, }) diff --git a/src/policy/bundle.wasm b/src/policy/bundle.wasm new file mode 100644 index 0000000000000000000000000000000000000000..4502473673808a3e274a0c8bbde66302e3f9dad0 GIT binary patch literal 354401 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 z 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

1dA>^eM18B%?{`u&SE<7t(=)0cmiFnrqdqJ1 zqUW&zYlc0l2daJ%{mj@t+*A%u_pyDW#=#3#Msr-a+(j9%%kivjv!W@lsrH?~s(}|f z-Ji&+p_;mQ8QQHYcoJ*iRjSkH@CE%2G`W)_U6Arqx>S4TsE!K13PunJ22N$KW?@PZ z&lv$U8fT#DG}dOAGrM<`p(gzf)~2(-$3D}AIj4GB<^m(uAOqCVJ8LWMW zU5L-Rd5H;Mh`gHdm1 zm9F5m@-E1CPxa^tuikdSmFO;;^A>6Id>5Jgzct zIf||ZT%i(z!($1o#HBkJFFnR>a9slHRk|mkfa{|N3|0(ljC`Vcc$9eZbb_XV1#5lk zGg^l#w2BQ0jOp+uSmv!p=U1QQoQ{fh~VheZSu-0h`kk9g;PnI|(c z6zkd>qXpux-^7bCG7uWeD+#RPMa@!9Hfys+J@wTDR{1jAA|Hz;jpR7X%Rfoz5>8&F-#hnn zUMM`jPM=Tplz+jSv!}-G{)$&b_+3nDC_}R?-=1&~m5O*oya^pFxPw;@uV6?T{%V(p ze1Dz5xQ%dU%z&JC@?ON=zAJ%sXP%O|E(qCWPTw~?E4((32}eS{TE&o)hGp&8)Fwuu;cGRe=IEYs|DGCV0mGo zWAdaiV@paLqsL5gOdUOC{EU*(W5*X3mO2BjGBFyDD64Y%bL~dn$p=k?Fgs$ti;TUC z0`vO0=OPj^1Hmk%8K>SFy{2tbg~D+Jt56jXaj183$>(HesjJZADHx3N+lHN*t<;%s zv(og5&jM-gluf0!~y@mN^*2Q6}xD1dNj#uEq9~;v(6WjFaBB z4Jk)C*L<{58O71gG;K;*V9tint@;ZK*~Or}DGSZ1!s~qQS6O5}NVs^^dBJQZS?4I{ zgg_%kt|{FNc^i-S4%oG#8$qcfklnX*yowe}9G*m#QQ5_1Y4iRRNKTe;Lc-{`d>_v9Bm z)yQYKr7_P&4UKt_W6x#gvyGztT?vS%KrT1;WWxxXp7Q>UoU$b5C`-&4%-xUG50?ic zH-;HJW!)f0xx)OoVbf__Zb$Xcy(4 zeyQUbN@Btvm&IxBIf5?$VAf?^({0=8!1U*MUFA7NIYowSQ)DOTEOq}~@@?EAYCK+l zx$4LF70i%W`%p1>vNfDmtB?#O`B0$hzqqY*x zfkhu}3A1>@kr)@(U%Y^$mf2p_NE`(m7IchaZuccggG`0XQyy*_McJWlD220Y%wKmf z%4I}T3&&*K$l8_>8>i*>cS)n-`5QGAjNk!PH+M41x)|4p$M4PXzc+sWhN41|a;>?} zP`r-hE5?nxZ95vREMOuW*+#-VA*(&56^Y5$u)Fq^Hsw0=WvNDei?snG52Ew^k9VeA zJALZdFMex2FX)9s8vgc+-_btAL=`3DkPh`FykGn__}bM%`ii4~|3)&E1Djv4>#vM` zr^o(82PVK+udc+mJUPcT9yHsrFrXP-#bn|yn-wf{U2nd?Vl?2!@sXfyg)!s8j;{~3 zZHnXlfN_KQxp>wb_b;enQ`G(iHI3}Ee?-Url5o$b58FjWtt=)+Ei)rV_&+|P^KC$e zJAB04jD0iTtEG{@;c|y^qxmrleI{w;6G=H~S9l>C1$Ck{LraAG5l{X_WvAv|(-WYpm(jydE0NxAMj zq7m2mA0NUUj&d&)4Ol6#rj;GBlT^9Y%=UUis|)%!Y)8yeb648o?s7-$Kvixtr}@>I zfSQdxzlDX<#~0)%x0^pb$f)SsX5H2(1#LU$%Z1*gD4RCeFVSA}ZImuO=b~nb1zV#a zZC!;%X=(LKMcXD;3W3^IXOw)#1dKeiZSv!tthK8Y|K{Pj{p7-UG3_tj#zQhy`zh~M z+Ijoym2tH3@WP8xIk)?^6xuapl#4dziiUIOwoQxp)S>*_yzu~|5)y*mZ<*m5MccNS zjg;Pu(zRcTiBR(UL$vndFa7q%FOAwt`y7wr;PCoJ&N8xJQvW@gsqwe*_StHT+Ijoy zm2tH3zmXKv&OX%`HI+YeSeHsH${prw(v1??s_43Zaf_6J_VK1fqZ;}%n~_nv^aCex z#{Fwtzt5&a{3B=k8;6YAO8Xq=;}|*hjeNg!_`B_v#NWo-XR9%4=k2do#?i+AM$%#I zt+__E*487eQCeD+$J#ov;g2rHyI$HhU1G)VFSW$4WqjD2yxja$>b~4lW7Nvpwz9Mt zH?A@LaJyfo{QY*q;xGO7H+mVh;r1yV#4+CL8~J{ja=%R3nzofuM`&ASj-`+|+W6l} zrZnDJR&Va;3OL=qD(4FNRRb%U{s#KREXCewP7HXs6>-O1=FW~e^6qYPlEYg=RzfQ( zRR2BZM0Q7JH&>aH9UfSdbyRr$*r|4}+2*Lg?R~haxZZE>#Ju{|IS-gSR`9qVG{t9rk3QZnL=yIl}6{aCpPqslo%Z+^&j(H_aW< z9~`)S%S=i|u%9)D?%p=1RCsIru*0eP=>8q^0qlv^?Ok&!#XFk}v~qi-Tg;uwg_p!f z<|MiirLonVOn2DS%nIjYb0-!SR_Q)5AHbf#QYp;;!IW@$t>;r7wFpZtJIyKNs|MEg z9A~P2?=F-a?r|8xH~c-bVO|;bjKAgnkS1npIPjf#FVZ+0XEW?Jr?Hpe)&rCALDwAh zzhNhzH{c?t@6BDMFTC1W4TGd)!~BO(+>Q#jvoi1_zo+DsdDV)FJ^X$)D{0*S$_pN8 z3HV^+-sx@%C5D+YZ%7;nDR(uu#c+IN|ytNiH*z-B!R;hv6ETrN@x1I7-&r~H0#OAQy{ z9~Ozm(=%X;O?5vaVqvD*s3F4onzK6asO10_Idh&ngzXGiYe^0u>#`L-W=W$~sC8Or z>B5Zpqv~K_-8;8ny(KLG!$E$PIWwn5%YlKp%+!**0!CGFbO!uAZn-ugjyVHa<~IC< z>3~(mKwt#gWiC!A2o}MT0xmg4WET>K^7wzFF{ecY$`h8ujRTPVOb57CwW`~i`=n)x zaY$}e7W~Fvfx`}>+LhJX`+UkW-Z(yzbLsd1ufH~%l_s}@sWU#SJZ*t-dafB^N0-;7 z`WZ|A&{KZ835yG*7rF6xgXNzge~9JeQ+4q?Yk~D_@fIErys*zV%5#+ zp5_ajwet@$Im+9X9G$j|HaCJXTpw?fhiEFf{tjdc+KQvBL=-joVVW~4_ zdfv1AlldRZwGeSW!Du=rX%f!%pmJ5-xAfFKpD(>;D<4=C_Ha5WH2Mk)k9WE;Q60hD zCitC|FzYv;yJagM8b!3l!m}=;E-W1D400!mN2H#9Dj!+;=@Nvd;Me-4T2Qu%rV@_v z7&^qUg};w2U3Jk-_4=}vPb>p;&f{@pW9{*-@?aH@gWXT_DW6)hbUw#AeL>8Xw6CI) z+-Awpc^sowx;)eQ0STX3rs|#^>tWjQ<X_P~Is6b<`;-ZBvH z&V04Q_!}hq3f3}$RwNmHuBJ3`t&~DsM@krNoBkv74yTYmK`^9F1F_eg46>&2w*@52F%@U2bvY{txZiu{U__b#anhIoE|1Qnvc* zuPF;U#FEd)A}shIFJo=!^$``m890nD&05tbYgF9~7H^RY803=8?? zd`{V68Eg<@GA1>i!TK;?TMlj+#xX44F*v^hf7!~;79PgpD^yshRCZYkbTQ0;_#ZqD zCqfG`my6|?crbrVdj7_8xGqqMUo{NE^O&Q2Ysu7woXl)Qi;`nP_ji^lIzJ`efN_d6 ziPQWPlcn93Lv`_qO5w#2${&|{L*uFPUm=rE3h+4*%@88XM7-d8F`1Aa$9u{nq88qM zupG_OVKC33Y0e~Ztad~cnp}zI@}s4@E?48cG@tcnD|;+`b&n?CqaLQXn%CzjKZ&`G zOpYj&nO>SxW`~R6XG^XoT&P9Q^iEgtVJ4vJy#Hdk#&DUT9K2iQlRL^Sn}KWQdd3_h z%z#;vqD4Sb(|q=lNK0+m%CCDd&up?xjL0;fe`?Z+MT0n-e6!`WR-^h|?Yqv(S&gj7 zC~4Jo`g5(n*x1)XqmlA=Xo$BQQ1**fzwy|dXhmsMYrk8t{CkL2#`~NWSg-!mc@!4J zaf~k=f=R~%JIh?b+H7T^^^LeTMfh-HyV!0Oo0VeNF={Ds@X{P&rqV(yW1{V<|wO3p$9G3AecD$JGP1qWycackHmssyIG_ubIS0kSK#~1NlFM{dw z)}m1NO-aXI&1f}2IdZijR=u>yf()TtYRzZS&tM10&QOChM^M`Ym%yhd)gKJarNUn{ zF0&pHP7&thGrjnvQzO2!MD#}VDP0e{+j9GQ=Jy>aGmiSl-Xn!h#fw`}Ib$Q`PQB(C`A;P5*7>U#q#?bEF!CAKs~Sl8|zTwLTuPFtkMj zd!@beY9rTU3^#T2m1V|jTTe}4VLwMct@wug=VWDJRhmgD%75BjS_j8W>#}y2)`FO6 zU2g3iDsKqTs#^`Jp$3B=IZD0tww9YzLSEWze+qRfIU4KbgdAmswbn?W6UQpCf!oMm zcrp#IG;4M^_*Q=?5>*DPqHgq88mzo~=~Go$SO(3TpbCAGa&;c9`70}}Psh{a=^l-DI(>5QWeCk zou`9u%}cu!8DIr0^OKDfgL<%?WW-_HbUzsyuY1MrLLsU2#aU*p6h9>cnsDVU(;`-X zmB+1o!;1XwjCo{0Wx^)kQP16ZBj>+!lqakcS^J9?W{R`6R2_>g{Z8y-@MFB-yIorP zpFqmr%9GY~_GoNvnOmLUb+g?yOelOxtc^u`32pV)Y&lV$whnFi0!=1nxNtzOI!%Zy zJVxx-e#Y9zFc|h?WGfr2GYmaVSA7uk^>Me9D#S1;Hhw%SMsx}tgu1-f!$0`P+>yXW zTQ&<)p0kb>DQXcm#ufxQR5QUqh&RuN%1j?i%)LX1MtQ-CEfWyGVpU5xL%ibIt62z* zgcVs9FIq=ML@BmDASBv3-As}qhsK+ft*JZSB<*7Qi59VcVP+Q_oeI#QDz)VrqRjq^@cD}r!QJ+X!tWs{KWWS%3#ABS~w7nW|u z&{m>XtbBV|bgyH*Znx7HI$(_b_Zbu0h{T(qI`HFb7Z5?#3KrpbDK9H zez0fQ09UQ%7|NPrtPFeKt5(2XK$Rc*MhW39PhukfNd-<*j%UKBOHc z{Ox!WKDZqw{2l8>hCJ>Ms@nLL#@-cQ=do@=L%Uke6`WWj84H!Av2MuEV`^M@Q9VK{4SR4&Q;PLz{U{T`u6VD1-|As8F}`%H$5jS-=t$UUkt-PCnLHA~ ze71~4JcyENO#ov1HGv%E1HsxS1&)IWf^xP`n0bpf1V#z}q4fmjii{qsNocH>b3c4c zmBpxuHG%_f5we3OCD;Rs9nDmZGW(i`(utRd%-}~>Z_5`*d5gxev12K*;8vfhKPG#;w*d%$3#Q_y9IriI250BaTQhZ&DvyPt`;nIpng4LnYi|)Qv0$8fY{z z$wYo4+IvLv(H2XI>UZ;2%R+0@u6!!iO+}*-nuAj@PPIskC@5u{XeSZxi{(2a#o9Iz z@jzzfGb>k{WyLZH@>gZ-np8d)p2M;q7r-F;=$*2aFLcsEgsjH4xT19^UmE!eNpxRX zwZmvg=@b!Qs$9Nx8ac`;eu3507)cz3hIXRq3 zw*8V)s{Cl>D)Raik*0k_#`jpcioD+A1gFcLt^8y?fN^gAl>TQcKU)vfxXtH|zgYjF zah&E0x~l1`qw;G+K3VRf56mH#ei(V#U}Z!>Yd$rFpI`GwNd~-+A3$Kdbo#HonVG z9|bGCaNSceW9UJ4bCiWPZ5trfrkWtLe}FR2Ru|_h#LI?^qWq1o#zoYmDB@lNcj!1Ss{Z;PdMpUMTc-4MjxqUUTo zYUHuXD83G1l(*m5NB^hT!$r1B%o=_^zSjGYL^^%X~{L&KL(1nrc3|t$u?v4_@`WKyCQBeo2UABm3VxMkC)g2akK)K2P1#F zk-4xiWTG!}CoHu`SR%O8cD~e|!;G6W0{-Hy z;*V<*`?i{{vW;eKW%_vRuc5WU);{HsKU&iAdIEBsyV@4l#?U`Rspt2kQ>god6nw6+ z6^HYVh<`)YueEXWr7T%mvo>Nlz0UUUc-FK3xT1-YhDa?Zq*M&t8daz3ZE4|>m`_Ea z++cez(YWif?S{r)=FnORn++R|*llaCpDpyYvaadCp*uJ}f+e3glGCrYs~i{=d#k$U zZCl*DwZ&8D>^K&qoV9Jj(L|V%XuQ)^qm;MfI-%wGz1`SrlvRi5HnaxTuKElnIjB;( z2l+ZHES8?SLCwd8ND=0JWJl0Dk!1??)g@|>qXyho$R+F@br(;nSw zD{1qZmp%F>8+t755+@OLoR@$9WiFaMPrSOM$~W^Wwc|pcf@v8;uD^31{z@KBm=D22 z6oU})Znn({zqXZ^M!Z6|a3Z%vQR-!q^r??{@h!Hp@QX|Mf(d*7)Yb*rXvGjclegNq zZhw{6dq$wJkSq7I{bkH-$aFFwG7-{N#~K}Akgfd3wmqKd0*y>C0Oxknww0m166KtTx&ljqSWM zy`0g~nzC}IZ93;pqIl7f{Uz?2z%;++APgRXuB(JtZ_AEzmu*-?q!gjH(-{Q4TNjkl z6KBwSY~1jZ%x;Se7`%3sZB|5zxt7|rkT!|fXdAsCIJ=L@N5mKAd*w2QC@=nsh`hBD zk#e6cQsYJHx~NmVT=`|MV!L0TAnk!9Jg2csj1R33*v3T^8*S;8C$hv91CQoGTTw(b zLVqvZOj|3M)wZz_5lmI*>h^1gZewRjdC1l~B9<9A(=?()l{GeQvQIWKZWCM+C^GgO z&SyCCw{coIZ_~B<9Hr6rkWmgMKuwQ6 zR<^^OD36OC8)6ut9h`cXY~_iVex)8#_`B_sLKM}vTdPM|3lII>6 z3z&M2Btyl!)%000b!nMs%y&YL*~)V^ZVyqz4`^Gs>W9`z3%6|Lc^kJB+u~6?iXt!A z_~8Rl0vjqzzi8vy?Xr(EJ#<$E1k;yn$7mRKNcBYHMmCZtLzAK_KWlvo;p1gdBJyp# zIJ6ov6lX|zW~12CE4_=IL|j)sTiIm0$*^fe)oIbDs+DDZT{{VH>5qtmT21tW0A7*Z z!0W`CQkg0%KWrtRXDmnAEPJKSXUwY8ra*bsb_%;6s|#&-oP~IGgt(|@pj<3^&BiN8 zAN^RTM><7_Cy`MquiLm5x%4YbVVqaGM1)CfXb886Le5d zovW5_xAigbTTLebtAQQ1%-Eh_oil*#L|@zb$M)lJdTJdiR9#%bowj~P{&2W6OW7`) zJ+?QVm2ZraUapqmC^N6;TU)16n2UfJ!oYX7Bo+EOwLUL~-@tBL5|-UzM+x>8&Qwhm zi9Wx#yrv8%TO}mpCux7F<%g8kCL|wQTH^`U*vqhBUpcB^aNgj&VfO5S0}JvC4jo)j uFgSlm!4U-oxIKJWxpU|cwct?aA%o}RgTUbV(#zmOhvXl6MBd@~%Krn;> | null = null + +async function getPolicy(): Promise>> { + if (!_policy) { + const wasmPath = fileURLToPath(new URL('./bundle.wasm', import.meta.url)) + _policy = await loadPolicy(readFileSync(wasmPath)) + } + return _policy +} + +/** + * Evaluates the bundled OPA policy against the given transaction plan and + * the data document loaded from `dataPath`. + * + * The policy exposes a single `decision` entrypoint shaped as + * `{ action, reasons }`. Returns `elicit` (the safe default) when the result + * is missing or malformed. + */ +export async function evaluatePolicy( + plan: OpaTransactionPlan, + dataPath: string, +): Promise { + const policy = await getPolicy() + const data = JSON.parse(readFileSync(dataPath, 'utf8')) as object + policy.setData(data) + + const results = policy.evaluate(plan.input) as Array<{ result?: { action?: unknown, reasons?: unknown } }> | null + const decision = results?.[0]?.result + const raw = decision?.action + const action: PolicyAction = raw === 'allow' || raw === 'deny' || raw === 'elicit' ? raw : 'elicit' + const denyReasons = action === 'deny' && Array.isArray(decision?.reasons) ? (decision.reasons as string[]) : [] + + return { action, denyReasons } +} diff --git a/src/policy/index.ts b/src/policy/index.ts new file mode 100644 index 0000000..49ed9f2 --- /dev/null +++ b/src/policy/index.ts @@ -0,0 +1,4 @@ +export { buildOpaTransactionPlan } from './transaction-plan' +export type { OpaTransactionPlan } from './transaction-plan' +export { evaluatePolicy } from './evaluate' +export type { PolicyAction, PolicyResult } from './evaluate' diff --git a/src/policy/rego/main.rego b/src/policy/rego/main.rego new file mode 100644 index 0000000..ec04409 --- /dev/null +++ b/src/policy/rego/main.rego @@ -0,0 +1,96 @@ +package mc8yp.transaction + +import rego.v1 + +# ───────────────────────────────────────────────────────────────────────────── +# Single decision object — the only entrypoint, consumed by evaluate.ts. +# action : "allow" | "elicit" | "deny" +# reasons : human-readable deny messages (empty unless action == "deny") +# +# Priority: deny > elicit > allow +# deny — a hard block (tenant / bulk-delete limit / restricted field) or an +# explicit "deny" path_policy matches any transaction +# elicit — no deny, but some transaction matches an "elicit" rule, or matches +# no rule at all (the safe default) +# allow — no deny, no elicit, and every transaction matches an "allow" rule +# ───────────────────────────────────────────────────────────────────────────── + +decision := {"action": action, "reasons": reasons} + +default action := "elicit" + +action := "deny" if count(reasons) > 0 + +action := "allow" if { + count(reasons) == 0 + not _any_elicit + _all_allow +} + +# ── Deny reasons (each clause adds a message; any message ⇒ deny) ───────────── + +reasons contains msg if { + not _tenant_allowed + msg := sprintf( + "Tenant '%v' is not in the allowed list", + [input.principal.tenant], + ) +} + +reasons contains msg if { + deletes := count([tx | some tx in input.transactions; tx.method == "DELETE"]) + deletes > data.limits.max_deletes_per_transaction + msg := sprintf( + "Bulk DELETE limit exceeded: %v requested, max %v allowed", + [deletes, data.limits.max_deletes_per_transaction], + ) +} + +reasons contains msg if { + some tx in input.transactions + tx.method in {"POST", "PUT", "PATCH"} + some field in data.restricted_body_fields + _ = tx.body[field] + msg := sprintf( + "%v %v attempts to set restricted field '%v'", + [tx.method, tx.path, field], + ) +} + +reasons contains msg if { + some tx in input.transactions + some rule in data.path_policies + rule.action == "deny" + _matches(rule, tx) + msg := sprintf( + "%v %v is denied by policy", + [tx.method, tx.pathTemplate], + ) +} + +# ── Elicit / allow checks ───────────────────────────────────────────────────── + +_any_elicit if { + some tx in input.transactions + some rule in data.path_policies + rule.action == "elicit" + _matches(rule, tx) +} + +_all_allow if { + every tx in input.transactions { + some rule in data.path_policies + rule.action == "allow" + _matches(rule, tx) + } +} + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +_tenant_allowed if input.principal.tenant in data.allowed_tenants + +# A rule matches a transaction when method (or "*") and the path glob both match. +_matches(rule, tx) if { + rule.method in {"*", tx.method} + glob.match(rule.path_glob, ["/"], tx.pathTemplate) +} diff --git a/src/policy/transaction-plan.ts b/src/policy/transaction-plan.ts new file mode 100644 index 0000000..e47634f --- /dev/null +++ b/src/policy/transaction-plan.ts @@ -0,0 +1,75 @@ +import type { InterceptedOp } from '../codemode/execute' + +interface OpaTransaction { + id: string + method: string + /** + * Exact path from the request, without query string. + */ + path: string + /** + * Path with numeric/UUID segments replaced by `*` so that glob patterns + * in data.json rules can match them directly. + * Example: `/inventory/managedObjects/12345` → `/inventory/managedObjects/*` + */ + pathTemplate: string + /** + * Extracted resource ID, or null when path has no trailing ID segment. + */ + resourceId: string | null + /** + * Parsed query parameters, or null when none present. + */ + queryParams: Record | null + /** + * Parsed request body, or null for bodyless methods. + */ + body: unknown +} + +export interface OpaTransactionPlan { + input: { + principal: { tenant: string } + transactions: OpaTransaction[] + context: { tool: 'mc8yp-execute' } + } +} + +function canonicalize(path: string): { base: string, id: string | null } { + const [pathPart, qs] = path.split('?', 2) as [string, string | undefined] + const segments = pathPart.split('/') + const last = segments[segments.length - 1] ?? '' + const isId = /^\d+$/.test(last) || /^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$/i.test(last) + if (isId) { + // Use `*` (not `{id}`) so the value works as a glob target in data.json rules. + segments[segments.length - 1] = '*' + return { base: segments.join('/') + (qs != null ? `?${qs}` : ''), id: last } + } + return { base: path, id: null } +} + +export function buildOpaTransactionPlan(ops: InterceptedOp[], tenantUrl: string): OpaTransactionPlan { + return { + input: { + principal: { tenant: tenantUrl }, + transactions: ops.map((op, i) => { + const [pathPart, qs] = op.path.split('?', 2) as [string, string | undefined] + const { base, id: resourceId } = canonicalize(op.path) + const pathTemplate = base.split('?')[0] as string + const queryParams = qs + ? Object.fromEntries(new URLSearchParams(qs)) + : null + return { + id: `op-${i}`, + method: op.method, + path: pathPart, + pathTemplate, + resourceId, + queryParams, + body: op.body, + } + }), + context: { tool: 'mc8yp-execute' }, + }, + } +} diff --git a/src/tools/codemode.ts b/src/tools/codemode.ts index 3249fc0..5736f3b 100644 --- a/src/tools/codemode.ts +++ b/src/tools/codemode.ts @@ -2,7 +2,7 @@ import { defineTool } from 'tmcp/tool' import { tool } from 'tmcp/utils' import * as v from 'valibot' import { execute, query } from '../codemode/execute' -import { requireMutatingApproval } from './intercept' +import { evaluatePolicies } from './intercept' import type { Env } from '../types' function createCodeSchema(description: string) { @@ -150,7 +150,7 @@ async () => { }), }, async (input) => { try { - const blocked = await requireMutatingApproval(input.code) + const blocked = await evaluatePolicies(input.code) if (blocked) return tool.error(blocked) return tool.text(await execute(input.code)) diff --git a/src/tools/intercept.ts b/src/tools/intercept.ts index d388dc3..02354c3 100644 --- a/src/tools/intercept.ts +++ b/src/tools/intercept.ts @@ -2,6 +2,7 @@ import * as v from 'valibot' import { dryRun } from '../codemode/execute' import type { InterceptedOp } from '../codemode/execute' import { c8yMcpServer } from '../server-instance' +import { buildOpaTransactionPlan, evaluatePolicy } from '../policy' // ───────────────────────────────────────────────────────────────────────── // Mutating-operation summary for elicitation @@ -107,82 +108,24 @@ function formatMutatingOpsSummary(ops: InterceptedOp[]): string { return lines.join('\n') } -// ───────────────────────────────────────────────────────────────────────── -// OPA transaction plan (informational — not yet evaluated against a policy) -// ───────────────────────────────────────────────────────────────────────── - -interface OpaTransaction { - id: string - method: string - /** - * Exact path from the request, without query string. - */ - path: string - /** - * Path with numeric/UUID segments replaced by {id}. - */ - pathTemplate: string - /** - * Extracted resource ID, or null when path has no trailing ID segment. - */ - resourceId: string | null - /** - * Parsed query parameters, or null when none present. - */ - queryParams: Record | null - /** - * Parsed request body, or null for bodyless methods. - */ - body: unknown -} - -export interface OpaTransactionPlan { - input: { - principal: { tenant: string } - transactions: OpaTransaction[] - context: { tool: 'mc8yp-execute' } - } -} - -function buildOpaTransactionPlan(ops: InterceptedOp[], tenantUrl: string): OpaTransactionPlan { - return { - input: { - principal: { tenant: tenantUrl }, - transactions: ops.map((op, i) => { - const [pathPart, qs] = op.path.split('?', 2) as [string, string | undefined] - const { base, id: resourceId } = canonicalize(op.path) - const pathTemplate = base.split('?')[0] as string - const queryParams = qs - ? Object.fromEntries(new URLSearchParams(qs)) - : null - return { - id: `op-${i}`, - method: op.method, - path: pathPart, - pathTemplate, - resourceId, - queryParams, - body: op.body, - } - }), - context: { tool: 'mc8yp-execute' }, - }, - } -} - // ───────────────────────────────────────────────────────────────────────── // Elicitation workflow // ───────────────────────────────────────────────────────────────────────── /** * Runs a dry-run of the given code and, if POST/PUT/DELETE operations are - * detected, asks the user for approval via MCP elicitation. + * detected, applies the OPA policy (when `--policy-data` was supplied) or + * falls back to MCP elicitation. + * + * OPA decisions: + * allow — proceed silently, no prompt + * elicit — show the approval prompt (same as the no-policy fallback) + * deny — auto-reject without prompting * * Returns null if execution should proceed, or an error string if blocked. * @param code The JavaScript code to analyze, as a zero-parameter function expression. - * @param opa Whether to include the OPA transaction plan in the approval prompt (informational only, not yet evaluated against a real policy). */ -export async function requireMutatingApproval(code: string, opa: boolean = false): Promise { +export async function evaluatePolicies(code: string): Promise { const ops = await dryRun(code) const mutating = ops.filter((o) => o.method === 'POST' || o.method === 'PUT' || o.method === 'DELETE') @@ -190,17 +133,33 @@ export async function requireMutatingApproval(code: string, opa: boolean = false return null const tenantUrl = c8yMcpServer.ctx.custom?.auth?.tenantUrl ?? '(unknown)' - const plan = buildOpaTransactionPlan(mutating, tenantUrl) + const policyDataPath = c8yMcpServer.ctx.custom?.policyDataPath + + // ── OPA policy evaluation ────────────────────────────────────────────── + if (policyDataPath) { + const plan = buildOpaTransactionPlan(mutating, tenantUrl) + let decision + try { + decision = await evaluatePolicy(plan, policyDataPath) + } catch (err) { + const reason = err instanceof Error ? err.message : String(err) + return `Execution blocked: OPA policy evaluation failed — ${reason}` + } + + if (decision.action === 'allow') + return null + if (decision.action === 'deny') { + const reasons = decision.denyReasons.length > 0 + ? `\n${decision.denyReasons.map((r) => `- ${r}`).join('\n')}` + : '' + return `Execution blocked by policy.${reasons}` + } + // action === 'elicit' → fall through to the elicitation prompt below + } + // ── Elicitation (no policy data, or policy says "elicit") ───────────── const message = [ formatMutatingOpsSummary(mutating), - ...(opa - ? [ - '', - '── OPA Transaction Plan (informational) ──', - JSON.stringify(plan, null, 2), - ] - : []), ].join('\n') // v.optional allows undefined content when action is 'decline' or 'cancel', diff --git a/src/types/mcp-context.ts b/src/types/mcp-context.ts index c6b32da..f72471d 100644 --- a/src/types/mcp-context.ts +++ b/src/types/mcp-context.ts @@ -42,4 +42,10 @@ export interface C8yMcpCustomContext extends Record { * May be absent in CLI mode until set-active-tenant is called. */ auth?: RequestAuth + /** + * Path to the OPA data.json file for policy-based approval decisions. + * CLI-only; set via --policy-data flag. When absent, all mutating ops + * require elicitation (legacy behaviour). + */ + policyDataPath?: string } diff --git a/tsdown.config.ts b/tsdown.config.ts index 8e2cd20..7c655f6 100644 --- a/tsdown.config.ts +++ b/tsdown.config.ts @@ -1,4 +1,4 @@ -import { readFileSync } from 'node:fs' +import { copyFileSync, readFileSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import { defineConfig } from 'tsdown' @@ -158,6 +158,21 @@ export function coreOpenApiPlugin(options: { mode: 'cli' } | { mode: 'server', b return createOpenApiPlugin('core', options) } +/** + * Rollup plugin: copies src/policy/bundle.wasm → dist/bundle.wasm after the + * CLI build. The evaluate module resolves it via import.meta.url at runtime. + */ +function copyPolicyWasmPlugin() { + return { + name: 'mc8yp:copy-policy-wasm', + closeBundle() { + const src = path.join(rootDir, 'src/policy/bundle.wasm') + const dest = path.join(rootDir, 'dist/bundle.wasm') + copyFileSync(src, dest) + }, + } +} + /** * Virtual module `#bundled-services` — exports BUNDLED_SERVICE_SPECS. * @@ -242,7 +257,7 @@ export default defineConfig([ clean: true, dts: false, format: 'module', - plugins: [coreOpenApiPlugin({ mode: 'cli' }), bundledServicesPlugin({ mode: 'cli' })], + plugins: [coreOpenApiPlugin({ mode: 'cli' }), bundledServicesPlugin({ mode: 'cli' }), copyPolicyWasmPlugin()], // Bundle every non-native dep to reduce supply-chain risk for CLI users. // @iso4/sandbox must stay external: it resolves per-platform Rust binaries // (@iso4/v8-*) at runtime and cannot be statically inlined.