@auctra/mcp-gateway 0.1.5 → 0.1.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auctra/mcp-gateway",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "MCP gateway — gate tool calls and MCP/skill installs through Auctra action.execute",
5
5
  "type": "module",
6
6
  "main": "./src/index.js",
package/src/index.js CHANGED
@@ -181,6 +181,39 @@ export async function gateMcpToolCall(input) {
181
181
  throw new McpToolBlockedError(message, result.decision, result.evidence);
182
182
  }
183
183
 
184
+ const requireLease = process.env.AUCTRA_REQUIRE_EXECUTION_LEASE === "1";
185
+ const leaseToken = result.execution_lease?.token;
186
+ if (requireLease || leaseToken) {
187
+ if (!leaseToken) {
188
+ throw new McpToolBlockedError(
189
+ "execution lease required but action.execute returned none — configure AUCTRA_EXECUTION_LEASE_SECRET",
190
+ "blocked",
191
+ result.evidence,
192
+ );
193
+ }
194
+ if (!input.client.executionLease?.consume) {
195
+ if (requireLease) {
196
+ throw new McpToolBlockedError(
197
+ "executionLease.consume client method required when AUCTRA_REQUIRE_EXECUTION_LEASE=1",
198
+ "blocked",
199
+ result.evidence,
200
+ );
201
+ }
202
+ } else {
203
+ const consumed = await input.client.executionLease.consume({
204
+ lease: leaseToken,
205
+ expectedActionType: resolveActionType(input),
206
+ });
207
+ if (!consumed.ok) {
208
+ throw new McpToolBlockedError(
209
+ consumed.error ?? "execution lease consume failed",
210
+ "blocked",
211
+ result.evidence,
212
+ );
213
+ }
214
+ }
215
+ }
216
+
184
217
  return result;
185
218
  }
186
219
 
package/src/index.ts CHANGED
@@ -18,6 +18,12 @@ export type ExecuteActionClient = {
18
18
  decision: "allowed" | "blocked" | "require_approval";
19
19
  reason: string;
20
20
  action_request_id?: string;
21
+ execution_lease?: {
22
+ token: string;
23
+ expires_at: string;
24
+ action_request_id: string;
25
+ action_type: string;
26
+ } | null;
21
27
  evidence?: {
22
28
  format: string;
23
29
  payload_hash: string;
@@ -26,6 +32,13 @@ export type ExecuteActionClient = {
26
32
  evidence_payload?: { evidence_id?: string };
27
33
  }>;
28
34
  };
35
+ /** Optional — required when AUCTRA_REQUIRE_EXECUTION_LEASE=1 */
36
+ executionLease?: {
37
+ consume(input: {
38
+ lease: string;
39
+ expectedActionType?: string;
40
+ }): Promise<{ ok: boolean; error?: string; reason_codes?: string[] }>;
41
+ };
29
42
  };
30
43
 
31
44
  /** @deprecated Use ExecuteActionClient — kept as type alias for migration notes only */
@@ -314,6 +327,39 @@ export async function gateMcpToolCall(input: McpToolGateInput) {
314
327
  throw new McpToolBlockedError(message, result.decision, result.evidence);
315
328
  }
316
329
 
330
+ const requireLease = process.env.AUCTRA_REQUIRE_EXECUTION_LEASE === "1";
331
+ const leaseToken = result.execution_lease?.token;
332
+ if (requireLease || leaseToken) {
333
+ if (!leaseToken) {
334
+ throw new McpToolBlockedError(
335
+ "execution lease required but action.execute returned none — configure AUCTRA_EXECUTION_LEASE_SECRET",
336
+ "blocked",
337
+ result.evidence,
338
+ );
339
+ }
340
+ if (!input.client.executionLease?.consume) {
341
+ if (requireLease) {
342
+ throw new McpToolBlockedError(
343
+ "executionLease.consume client method required when AUCTRA_REQUIRE_EXECUTION_LEASE=1",
344
+ "blocked",
345
+ result.evidence,
346
+ );
347
+ }
348
+ } else {
349
+ const consumed = await input.client.executionLease.consume({
350
+ lease: leaseToken,
351
+ expectedActionType: resolveActionType(input),
352
+ });
353
+ if (!consumed.ok) {
354
+ throw new McpToolBlockedError(
355
+ consumed.error ?? "execution lease consume failed",
356
+ "blocked",
357
+ result.evidence,
358
+ );
359
+ }
360
+ }
361
+ }
362
+
317
363
  return result;
318
364
  }
319
365