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 +64 -0
- package/README.md +2 -2
- package/dist/{chunk-6E2DHBAR.mjs → chunk-744JMCY4.mjs} +9 -1
- package/dist/chunk-AYNQIEN7.mjs +10 -0
- package/dist/{chunk-JCMDLN5I.mjs → chunk-CXW2EIRM.mjs} +2 -2
- package/dist/{chunk-LJQOALYR.mjs → chunk-FFVJL3KQ.mjs} +5 -564
- package/dist/{chunk-VTPZ4G5I.mjs → chunk-GHR65WVD.mjs} +1 -1
- package/dist/{chunk-WIPWNWMJ.mjs → chunk-IDUH2O4Q.mjs} +1 -0
- package/dist/chunk-JIDDQUSQ.mjs +568 -0
- package/dist/chunk-KMNXHGGT.mjs +94 -0
- package/dist/{chunk-WV4DKYE4.mjs → chunk-UWB5ALVO.mjs} +10 -12
- package/dist/claim-TUDH2WPB.mjs +201 -0
- package/dist/cli.js +610 -31
- package/dist/cli.mjs +308 -24
- package/dist/{ed25519-BSHMMVNX.mjs → ed25519-SQA3S2RV.mjs} +2 -1
- package/dist/hook-server.js +428 -0
- package/dist/hook-server.mjs +6 -2
- package/dist/{http-transport-JBORN27G.mjs → http-transport-D7C64PIA.mjs} +2 -2
- package/dist/index.d.mts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +107 -18
- package/dist/index.mjs +14 -9
- package/dist/{signing-committed-QXCW24RF.mjs → signing-committed-TGWXSLAO.mjs} +4 -2
- package/package.json +1 -1
- package/policies/agent.cedar +0 -50
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.
|
|
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.
|
|
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-
|
|
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 {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
meetsMinTier
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GHR65WVD.mjs";
|
|
4
4
|
import {
|
|
5
5
|
checkRateLimit,
|
|
6
6
|
getToolPolicy,
|
|
7
7
|
parseRateLimit
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IDUH2O4Q.mjs";
|
|
9
9
|
|
|
10
10
|
// src/simulate.ts
|
|
11
11
|
import { readFileSync } from "fs";
|