protect-mcp 0.7.6 → 0.9.2

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 CHANGED
@@ -1,5 +1,69 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.2: anchor a claim to the public log
4
+
5
+ Closes the one honest gap in a bare claim: that the disclosed set is complete.
6
+
7
+ - Added `protect-mcp claim --anchor`: records the claim's digest in the public,
8
+ append-only ScopeBlind transparency log, so a counterparty who does not trust
9
+ you can confirm the exact claim existed at a time and was not quietly re-cut.
10
+ Only the hash is sent; the claim, its leaves, and every receipt stay on your
11
+ machine. Writes a `<claim>.anchor.json` sidecar with the log entry and a
12
+ verify URL. Anonymous and free; enrolling an org identity a counterparty can
13
+ pin is the paid upgrade (scopeblind.com/enroll).
14
+
15
+ ## 0.9.1: prove a claim without revealing the record
16
+
17
+ The record viewer closes the loop from a decision to a portable proof.
18
+
19
+ - The `record` viewer surfaces the exact `claim` command when you filter by a
20
+ capability, so a decision becomes a signed, position-blind attestation in one
21
+ step, with copy-to-clipboard and an offline `verify-claim` hint.
22
+ - The browser drop-viewer (legate.scopeblind.com/record) reached parity with
23
+ the CLI: signed capability tags, a capability facet, and a provenance tree.
24
+
25
+ ## 0.9.0: signed, position-blind claim attestations
26
+
27
+ Prove a predicate over the record without revealing it.
28
+
29
+ - Added `protect-mcp claim`: mints a signed attestation of a predicate over the
30
+ record (`--no <cap>` for "no action carried this capability", `--only`,
31
+ `--count`/`--no-verdict <verdict>`), disclosing only per-decision categories
32
+ (receipt digest, verdict, capability tags), never inputs, outputs, or data.
33
+ - Added `protect-mcp verify-claim`: checks it offline via Ed25519 over the pack,
34
+ a recomputed Merkle root over the disclosed set, and the predicate recomputed
35
+ independently. Honest trust model: an accountable position-blind attestation,
36
+ not zero-knowledge; set-completeness is issuer-attested.
37
+
38
+ ## 0.8.0: deterministic receipt enrichment
39
+
40
+ Each signed decision now carries minimum-disclosure, rule-derived metadata.
41
+
42
+ - `input_digest`: SHA-256 of the canonicalized tool input, so you can prove what
43
+ was requested without storing it.
44
+ - Signed `capabilities`: deterministic, rule-derived tags (fs.read, fs.write,
45
+ net.egress, secret.adjacent, destructive, financial, exec.shell, ...) so the
46
+ record is queryable by what an action touched.
47
+ - `resource`: the hashed target (path, host, or command). The gate sees tool
48
+ calls, not the model's prompt or reasoning, and does not claim to.
49
+
50
+ ## 0.7.6: the live record viewer
51
+
52
+ - Added `protect-mcp record --live`: a local, streaming view of the receipt
53
+ file that turns decisions into a searchable, auto-labelled record as the agent
54
+ runs (stat strip, per-row signed badge and digest, a List/Tree provenance
55
+ view), all local, nothing uploaded.
56
+ - One-click export: `.jsonl` carrying the real signatures (so a recipient
57
+ verifies offline with `npx @veritasacta/verify`) plus a Markdown report.
58
+
59
+ ## 0.7.5: honest version strings and the record viewer
60
+
61
+ - Added `protect-mcp record`, a local browser viewer over the receipts file
62
+ (the answer to "the receipts are a hidden dotfile I cannot find").
63
+ - Fixed hard-coded version strings in the banner and health/serverInfo: they
64
+ read the resolved package version now.
65
+ - WebAuthn co-sign hardening: verify the rpIdHash and enforce challenge expiry.
66
+
3
67
  ## 0.7.4: the self-serve trial path
4
68
 
5
69
  Everything the scopeblind.com trial and docs pages describe now ships in the
package/README.md CHANGED
@@ -189,7 +189,7 @@ session always runs the gate you tested:
189
189
  "hooks": [
190
190
  {
191
191
  "type": "command",
192
- "command": "npx protect-mcp@0.7.3 evaluate --cedar ./cedar --tool \"$TOOL_NAME\" --input \"$TOOL_INPUT\""
192
+ "command": "npx protect-mcp@0.9.1 evaluate --cedar ./cedar --tool \"$TOOL_NAME\" --input \"$TOOL_INPUT\""
193
193
  }
194
194
  ]
195
195
  }
@@ -200,7 +200,7 @@ session always runs the gate you tested:
200
200
  "hooks": [
201
201
  {
202
202
  "type": "command",
203
- "command": "npx protect-mcp@0.7.3 sign --tool \"$TOOL_NAME\" --receipts ./receipts --key ./keys/gateway.json"
203
+ "command": "npx protect-mcp@0.9.1 sign --tool \"$TOOL_NAME\" --receipts ./receipts --key ./keys/gateway.json"
204
204
  }
205
205
  ]
206
206
  }
@@ -1,3 +1,6 @@
1
+ import {
2
+ buildEnrichment
3
+ } from "./chunk-KMNXHGGT.mjs";
1
4
  import {
2
5
  ReceiptBuffer,
3
6
  buildActionReadback,
@@ -12,7 +15,7 @@ import {
12
15
  loadPolicy,
13
16
  parseRateLimit,
14
17
  signDecision
15
- } from "./chunk-WIPWNWMJ.mjs";
18
+ } from "./chunk-IDUH2O4Q.mjs";
16
19
 
17
20
  // src/hook-server.ts
18
21
  import { createServer } from "http";
@@ -243,6 +246,9 @@ async function handlePreToolUse(input, state) {
243
246
  });
244
247
  const payloadDigest = computePayloadDigest(input.toolInput);
245
248
  const actionReadback = buildActionReadback(toolName, input.toolInput || {});
249
+ const enrichment = buildEnrichment(toolName, input.toolInput || {});
250
+ const inflightRec = state.inflightTools.get(requestId);
251
+ if (inflightRec) inflightRec.enrichment = enrichment;
246
252
  const swarm = {
247
253
  ...state.swarmContext,
248
254
  ...input.agentId && { agent_id: input.agentId },
@@ -662,6 +668,8 @@ function emitDecisionLog(state, entry) {
662
668
  ...entry.sandbox_state && { sandbox_state: entry.sandbox_state },
663
669
  ...entry.plan_receipt_id && { plan_receipt_id: entry.plan_receipt_id }
664
670
  };
671
+ const enr = state.inflightTools.get(log.request_id)?.enrichment;
672
+ if (enr) log.enrichment = enr;
665
673
  process.stderr.write(`[PROTECT_MCP] ${JSON.stringify(log)}
666
674
  `);
667
675
  try {
@@ -0,0 +1,10 @@
1
+ import {
2
+ sha256
3
+ } from "./chunk-JIDDQUSQ.mjs";
4
+
5
+ // node_modules/@noble/hashes/esm/sha256.js
6
+ var sha2562 = sha256;
7
+
8
+ export {
9
+ sha2562 as sha256
10
+ };
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  meetsMinTier
3
- } from "./chunk-VTPZ4G5I.mjs";
3
+ } from "./chunk-GHR65WVD.mjs";
4
4
  import {
5
5
  checkRateLimit,
6
6
  getToolPolicy,
7
7
  parseRateLimit
8
- } from "./chunk-WIPWNWMJ.mjs";
8
+ } from "./chunk-IDUH2O4Q.mjs";
9
9
 
10
10
  // src/simulate.ts
11
11
  import { readFileSync } from "fs";