@tenova/swt3-mcp 0.1.0 → 0.5.1
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/README.md +1 -1
- package/dist/chain-verifier.d.ts +46 -0
- package/dist/chain-verifier.d.ts.map +1 -0
- package/dist/chain-verifier.js +210 -0
- package/dist/chain-verifier.js.map +1 -0
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/density-policy.d.ts +55 -0
- package/dist/density-policy.d.ts.map +1 -0
- package/dist/density-policy.js +124 -0
- package/dist/density-policy.js.map +1 -0
- package/dist/redis-reader.d.ts +57 -0
- package/dist/redis-reader.d.ts.map +1 -0
- package/dist/redis-reader.js +254 -0
- package/dist/redis-reader.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +442 -0
- package/dist/server.js.map +1 -1
- package/dist/state.d.ts +27 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +18 -0
- package/dist/state.js.map +1 -0
- package/dist/tools/audit.d.ts +20 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +102 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/authorize.d.ts +19 -0
- package/dist/tools/authorize.d.ts.map +1 -0
- package/dist/tools/authorize.js +96 -0
- package/dist/tools/authorize.js.map +1 -0
- package/dist/tools/chain.d.ts +24 -0
- package/dist/tools/chain.d.ts.map +1 -0
- package/dist/tools/chain.js +114 -0
- package/dist/tools/chain.js.map +1 -0
- package/dist/tools/model.d.ts +33 -0
- package/dist/tools/model.d.ts.map +1 -0
- package/dist/tools/model.js +162 -0
- package/dist/tools/model.js.map +1 -0
- package/dist/tools/signup.d.ts +2 -2
- package/dist/tools/signup.d.ts.map +1 -1
- package/dist/tools/signup.js +10 -3
- package/dist/tools/signup.js.map +1 -1
- package/dist/tools/skill.d.ts +33 -0
- package/dist/tools/skill.d.ts.map +1 -0
- package/dist/tools/skill.js +168 -0
- package/dist/tools/skill.js.map +1 -0
- package/dist/tools/suggest.d.ts +15 -0
- package/dist/tools/suggest.d.ts.map +1 -0
- package/dist/tools/suggest.js +174 -0
- package/dist/tools/suggest.js.map +1 -0
- package/dist/tools/trust.d.ts +33 -0
- package/dist/tools/trust.d.ts.map +1 -0
- package/dist/tools/trust.js +209 -0
- package/dist/tools/trust.js.map +1 -0
- package/dist/tools/violation.d.ts +20 -0
- package/dist/tools/violation.d.ts.map +1 -0
- package/dist/tools/violation.js +97 -0
- package/dist/tools/violation.js.map +1 -0
- package/dist/tools/witness.d.ts +6 -1
- package/dist/tools/witness.d.ts.map +1 -1
- package/dist/tools/witness.js +19 -5
- package/dist/tools/witness.js.map +1 -1
- package/package.json +25 -2
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server: verify_agent_trust + present_trust_credential tools.
|
|
3
|
+
*
|
|
4
|
+
* Enables LLMs to autonomously verify counterpart agents before
|
|
5
|
+
* proceeding with tool calls or data exchange. The compliance anchor
|
|
6
|
+
* IS the authorization credential.
|
|
7
|
+
*
|
|
8
|
+
* AI-TRUST.1: Trust verification result (PASS/FAIL)
|
|
9
|
+
* AI-TRUST.2: Handshake evidence (checks performed/passed)
|
|
10
|
+
*/
|
|
11
|
+
import { mintFingerprint, sha256Truncated, timestampMs, signPayload, } from "../fingerprint.js";
|
|
12
|
+
// ── Trust Level Constants ──────────────────────────────────────────
|
|
13
|
+
const TRUST_DENIED = 0;
|
|
14
|
+
const TRUST_BASIC = 1;
|
|
15
|
+
const TRUST_VERIFIED = 2;
|
|
16
|
+
const TRUST_ATTESTED = 3;
|
|
17
|
+
const TRUST_SOVEREIGN = 4;
|
|
18
|
+
const TRUST_LEVEL_NAMES = {
|
|
19
|
+
0: "denied",
|
|
20
|
+
1: "basic",
|
|
21
|
+
2: "verified",
|
|
22
|
+
3: "attested",
|
|
23
|
+
4: "sovereign",
|
|
24
|
+
};
|
|
25
|
+
function verifyCounterpart(args, config, state) {
|
|
26
|
+
let checks = 0;
|
|
27
|
+
let passed = 0;
|
|
28
|
+
// Check 1: deny list
|
|
29
|
+
checks++;
|
|
30
|
+
if (state.deniedAgents.has(args.counterpart_agent_id)) {
|
|
31
|
+
return { granted: false, trustLevel: TRUST_DENIED, denialReason: "deny_listed", checksPerformed: checks, checksPassed: passed };
|
|
32
|
+
}
|
|
33
|
+
passed++;
|
|
34
|
+
// Check 2: tenant trust (same tenant always trusted)
|
|
35
|
+
checks++;
|
|
36
|
+
const isSameTenant = args.counterpart_tenant_id === config.tenantId;
|
|
37
|
+
const isTrustedTenant = state.trustedTenants.has(args.counterpart_tenant_id);
|
|
38
|
+
if (!isSameTenant && !isTrustedTenant) {
|
|
39
|
+
return { granted: false, trustLevel: TRUST_DENIED, denialReason: "tenant_not_trusted", checksPerformed: checks, checksPassed: passed };
|
|
40
|
+
}
|
|
41
|
+
passed++;
|
|
42
|
+
// Check 3: anchor freshness (24h default)
|
|
43
|
+
checks++;
|
|
44
|
+
const freshnessMs = 24 * 60 * 60 * 1000;
|
|
45
|
+
const anchorTs = args.anchor_timestamp_ms ?? Date.now();
|
|
46
|
+
const ageMs = Date.now() - anchorTs;
|
|
47
|
+
if (ageMs > freshnessMs) {
|
|
48
|
+
return { granted: false, trustLevel: TRUST_DENIED, denialReason: "anchor_expired", checksPerformed: checks, checksPassed: passed };
|
|
49
|
+
}
|
|
50
|
+
passed++;
|
|
51
|
+
// Check 4: signature (informational, not required by default)
|
|
52
|
+
checks++;
|
|
53
|
+
passed++; // Always passes unless we add require_signature config
|
|
54
|
+
// Compute trust level
|
|
55
|
+
let level = TRUST_BASIC;
|
|
56
|
+
if (args.is_signed) {
|
|
57
|
+
level = TRUST_VERIFIED;
|
|
58
|
+
if (args.has_hardware_attestation && args.has_guardrails) {
|
|
59
|
+
level = (args.clearing_level ?? 1) >= 2 ? TRUST_SOVEREIGN : TRUST_ATTESTED;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return { granted: true, trustLevel: level, checksPerformed: checks, checksPassed: passed };
|
|
63
|
+
}
|
|
64
|
+
// ── Handlers ───────────────────────────────────────────────────────
|
|
65
|
+
export async function handleVerifyAgentTrust(args, config, client, state) {
|
|
66
|
+
const clearingLevel = args.clearing_level ?? config.clearingLevel;
|
|
67
|
+
const result = verifyCounterpart(args, config, state);
|
|
68
|
+
const verdict1 = result.granted ? "PASS" : "FAIL";
|
|
69
|
+
const levelName = TRUST_LEVEL_NAMES[result.trustLevel] ?? "unknown";
|
|
70
|
+
// ── Mint AI-TRUST.1 ──
|
|
71
|
+
const [ts1, epoch1] = timestampMs();
|
|
72
|
+
const fa1 = 1, fb1 = result.granted ? 1 : 0, fc1 = result.trustLevel;
|
|
73
|
+
const fp1 = mintFingerprint(config.tenantId, "AI-TRUST.1", fa1, fb1, fc1, ts1);
|
|
74
|
+
const p1 = {
|
|
75
|
+
procedure_id: "AI-TRUST.1",
|
|
76
|
+
factor_a: fa1, factor_b: fb1, factor_c: fc1,
|
|
77
|
+
clearing_level: clearingLevel,
|
|
78
|
+
anchor_fingerprint: fp1,
|
|
79
|
+
anchor_epoch: epoch1,
|
|
80
|
+
fingerprint_timestamp_ms: ts1,
|
|
81
|
+
};
|
|
82
|
+
if (clearingLevel <= 1) {
|
|
83
|
+
p1.ai_model_id = `trust-${levelName}`;
|
|
84
|
+
p1.ai_context = {
|
|
85
|
+
provider: "trust-mesh",
|
|
86
|
+
counterpart_agent_id: args.counterpart_agent_id,
|
|
87
|
+
counterpart_tenant_id: args.counterpart_tenant_id,
|
|
88
|
+
trust_level: result.trustLevel,
|
|
89
|
+
trust_level_name: levelName,
|
|
90
|
+
checks_performed: result.checksPerformed,
|
|
91
|
+
checks_passed: result.checksPassed,
|
|
92
|
+
granted: result.granted,
|
|
93
|
+
...(result.denialReason ? { denial_reason: result.denialReason } : {}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
else if (clearingLevel === 2) {
|
|
97
|
+
p1.ai_model_id = `trust-${levelName}`;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
p1.ai_model_id = sha256Truncated(`trust-${levelName}`);
|
|
101
|
+
}
|
|
102
|
+
p1.witness_source = "mcp";
|
|
103
|
+
const agentId = args.agent_id || config.agentId;
|
|
104
|
+
if (agentId)
|
|
105
|
+
p1.agent_id = agentId;
|
|
106
|
+
if (args.cycle_id)
|
|
107
|
+
p1.cycle_id = args.cycle_id;
|
|
108
|
+
if (config.signingKey) {
|
|
109
|
+
p1.payload_signature = signPayload(config.signingKey, fp1, agentId);
|
|
110
|
+
}
|
|
111
|
+
// ── Mint AI-TRUST.2 ──
|
|
112
|
+
const [ts2, epoch2] = timestampMs();
|
|
113
|
+
const fa2 = result.checksPerformed, fb2 = result.checksPassed;
|
|
114
|
+
const fc2 = result.granted ? 1 : 0;
|
|
115
|
+
const fp2 = mintFingerprint(config.tenantId, "AI-TRUST.2", fa2, fb2, fc2, ts2);
|
|
116
|
+
const p2 = {
|
|
117
|
+
procedure_id: "AI-TRUST.2",
|
|
118
|
+
factor_a: fa2, factor_b: fb2, factor_c: fc2,
|
|
119
|
+
clearing_level: clearingLevel,
|
|
120
|
+
anchor_fingerprint: fp2,
|
|
121
|
+
anchor_epoch: epoch2,
|
|
122
|
+
fingerprint_timestamp_ms: ts2,
|
|
123
|
+
};
|
|
124
|
+
if (clearingLevel <= 1) {
|
|
125
|
+
p2.ai_model_id = "trust-handshake";
|
|
126
|
+
p2.ai_context = {
|
|
127
|
+
provider: "trust-mesh",
|
|
128
|
+
counterpart_agent_id: args.counterpart_agent_id,
|
|
129
|
+
handshake_result: result.granted ? "granted" : "denied",
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
p2.witness_source = "mcp";
|
|
133
|
+
if (agentId)
|
|
134
|
+
p2.agent_id = agentId;
|
|
135
|
+
if (args.cycle_id)
|
|
136
|
+
p2.cycle_id = args.cycle_id;
|
|
137
|
+
if (config.signingKey) {
|
|
138
|
+
p2.payload_signature = signPayload(config.signingKey, fp2, agentId);
|
|
139
|
+
}
|
|
140
|
+
// ── Demo mode ──
|
|
141
|
+
if (config.demo) {
|
|
142
|
+
const demoAnchor1 = `SWT3-DEMO-LOCAL-AI-AITRUST1-${verdict1}-${epoch1}-${fp1}`;
|
|
143
|
+
const demoAnchor2 = `SWT3-DEMO-LOCAL-AI-AITRUST2-${fc2 ? "PASS" : "FAIL"}-${epoch2}-${fp2}`;
|
|
144
|
+
return [
|
|
145
|
+
`[DEMO MODE: local only, not persisted]`,
|
|
146
|
+
``,
|
|
147
|
+
`Trust Verification: ${result.granted ? "GRANTED" : "DENIED"}`,
|
|
148
|
+
`Trust Level: ${result.trustLevel} (${levelName})`,
|
|
149
|
+
...(result.denialReason ? [`Denial Reason: ${result.denialReason}`] : []),
|
|
150
|
+
`Checks: ${result.checksPassed}/${result.checksPerformed} passed`,
|
|
151
|
+
``,
|
|
152
|
+
`Counterpart: ${args.counterpart_agent_id} @ ${args.counterpart_tenant_id}`,
|
|
153
|
+
`Anchor: ${args.anchor_fingerprint}`,
|
|
154
|
+
``,
|
|
155
|
+
`AI-TRUST.1 Anchor: ${demoAnchor1}`,
|
|
156
|
+
`AI-TRUST.2 Anchor: ${demoAnchor2}`,
|
|
157
|
+
``,
|
|
158
|
+
`This anchor was minted locally. To persist anchors to the SWT3 ledger,`,
|
|
159
|
+
`use the signup tool to create a free account, or set SWT3_API_KEY.`,
|
|
160
|
+
].join("\n");
|
|
161
|
+
}
|
|
162
|
+
// ── Live mode: POST both anchors ──
|
|
163
|
+
const receipt1 = await client.postWitness(p1);
|
|
164
|
+
const receipt2 = await client.postWitness(p2);
|
|
165
|
+
if (receipt1.tenant_id && !process.env.SWT3_TENANT_ID) {
|
|
166
|
+
config.tenantId = receipt1.tenant_id;
|
|
167
|
+
}
|
|
168
|
+
return [
|
|
169
|
+
`Trust Verification: ${result.granted ? "GRANTED" : "DENIED"}`,
|
|
170
|
+
`Trust Level: ${result.trustLevel} (${levelName})`,
|
|
171
|
+
...(result.denialReason ? [`Denial Reason: ${result.denialReason}`] : []),
|
|
172
|
+
`Checks: ${result.checksPassed}/${result.checksPerformed} passed`,
|
|
173
|
+
``,
|
|
174
|
+
`Counterpart: ${args.counterpart_agent_id} @ ${args.counterpart_tenant_id}`,
|
|
175
|
+
``,
|
|
176
|
+
`AI-TRUST.1 Verdict: ${receipt1.verdict}`,
|
|
177
|
+
`AI-TRUST.1 Anchor: ${receipt1.swt3_anchor}`,
|
|
178
|
+
`AI-TRUST.2 Anchor: ${receipt2.swt3_anchor}`,
|
|
179
|
+
`Witnessed: ${receipt1.witnessed_at}`,
|
|
180
|
+
`Verify: ${config.endpoint}${receipt1.verification_url}`,
|
|
181
|
+
].join("\n");
|
|
182
|
+
}
|
|
183
|
+
export function handlePresentCredential(args, config) {
|
|
184
|
+
const agentId = args.agent_id || config.agentId || "anonymous";
|
|
185
|
+
const ts = Date.now();
|
|
186
|
+
const fpInput = `${agentId}:${config.tenantId}:${ts}`;
|
|
187
|
+
const fp = sha256Truncated(fpInput, 12);
|
|
188
|
+
return [
|
|
189
|
+
`Trust Credential for Agent-to-Agent Verification`,
|
|
190
|
+
``,
|
|
191
|
+
`agent_id: ${agentId}`,
|
|
192
|
+
`tenant_id: ${config.tenantId}`,
|
|
193
|
+
`anchor_fingerprint: ${fp}`,
|
|
194
|
+
`anchor_timestamp_ms: ${ts}`,
|
|
195
|
+
`is_signed: ${Boolean(config.signingKey)}`,
|
|
196
|
+
`clearing_level: ${config.clearingLevel}`,
|
|
197
|
+
`has_guardrails: false`,
|
|
198
|
+
`has_hardware_attestation: false`,
|
|
199
|
+
``,
|
|
200
|
+
`Pass these fields to another agent's verify_agent_trust tool`,
|
|
201
|
+
`to establish mutual compliance trust before exchanging data.`,
|
|
202
|
+
...(config.demo ? [
|
|
203
|
+
``,
|
|
204
|
+
`[DEMO MODE: This credential is local-only. Create a free account`,
|
|
205
|
+
`with the signup tool to get a persistent identity.]`,
|
|
206
|
+
] : []),
|
|
207
|
+
].join("\n");
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/tools/trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server: report_violation tool.
|
|
3
|
+
*
|
|
4
|
+
* Voluntary self-attestation of a policy violation. The agent reports
|
|
5
|
+
* its own violation. Always mints a FAIL anchor. Never blocks execution.
|
|
6
|
+
* FAIL anchors trigger downstream alerts via the existing pipeline.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpConfig } from "../config.js";
|
|
9
|
+
import type { AxiomClient } from "../client.js";
|
|
10
|
+
interface ViolationArgs {
|
|
11
|
+
violation_type: string;
|
|
12
|
+
description: string;
|
|
13
|
+
severity?: string;
|
|
14
|
+
agent_id?: string;
|
|
15
|
+
cycle_id?: string;
|
|
16
|
+
clearing_level?: 0 | 1 | 2 | 3;
|
|
17
|
+
}
|
|
18
|
+
export declare function handleReportViolation(args: ViolationArgs, config: McpConfig, client: AxiomClient): Promise<string>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=violation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation.d.ts","sourceRoot":"","sources":["../../src/tools/violation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAehE,UAAU,aAAa;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAChC;AAED,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CA8FjB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SWT3 MCP Server: report_violation tool.
|
|
3
|
+
*
|
|
4
|
+
* Voluntary self-attestation of a policy violation. The agent reports
|
|
5
|
+
* its own violation. Always mints a FAIL anchor. Never blocks execution.
|
|
6
|
+
* FAIL anchors trigger downstream alerts via the existing pipeline.
|
|
7
|
+
*/
|
|
8
|
+
import { mintFingerprint, sha256Truncated, timestampMs, signPayload, } from "../fingerprint.js";
|
|
9
|
+
const SEVERITY_SCORES = {
|
|
10
|
+
low: 1,
|
|
11
|
+
medium: 2,
|
|
12
|
+
high: 3,
|
|
13
|
+
critical: 4,
|
|
14
|
+
};
|
|
15
|
+
export async function handleReportViolation(args, config, client) {
|
|
16
|
+
const procedureId = "AI-VIO.1";
|
|
17
|
+
const clearingLevel = args.clearing_level ?? config.clearingLevel;
|
|
18
|
+
const severity = args.severity || "medium";
|
|
19
|
+
const severityScore = SEVERITY_SCORES[severity.toLowerCase()] ?? 2;
|
|
20
|
+
// AI-VIO.1 factors: violation reported (1), violation occurred (0 = fail), severity score
|
|
21
|
+
const factorA = 1;
|
|
22
|
+
const factorB = 0; // always FAIL
|
|
23
|
+
const factorC = severityScore;
|
|
24
|
+
const [ts, epoch] = timestampMs();
|
|
25
|
+
const fp = mintFingerprint(config.tenantId, procedureId, factorA, factorB, factorC, ts);
|
|
26
|
+
const payload = {
|
|
27
|
+
procedure_id: procedureId,
|
|
28
|
+
factor_a: factorA,
|
|
29
|
+
factor_b: factorB,
|
|
30
|
+
factor_c: factorC,
|
|
31
|
+
clearing_level: clearingLevel,
|
|
32
|
+
anchor_fingerprint: fp,
|
|
33
|
+
anchor_epoch: epoch,
|
|
34
|
+
fingerprint_timestamp_ms: ts,
|
|
35
|
+
};
|
|
36
|
+
// Apply clearing level
|
|
37
|
+
if (clearingLevel <= 1) {
|
|
38
|
+
payload.ai_model_id = args.violation_type;
|
|
39
|
+
payload.ai_context = {
|
|
40
|
+
provider: "self-report",
|
|
41
|
+
violation_type: args.violation_type,
|
|
42
|
+
description: args.description,
|
|
43
|
+
severity,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
else if (clearingLevel === 2) {
|
|
47
|
+
payload.ai_model_id = args.violation_type;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
payload.ai_model_id = sha256Truncated(args.violation_type);
|
|
51
|
+
}
|
|
52
|
+
payload.witness_source = "mcp";
|
|
53
|
+
const agentId = args.agent_id || config.agentId;
|
|
54
|
+
if (agentId)
|
|
55
|
+
payload.agent_id = agentId;
|
|
56
|
+
if (args.cycle_id)
|
|
57
|
+
payload.cycle_id = args.cycle_id;
|
|
58
|
+
if (config.signingKey) {
|
|
59
|
+
payload.payload_signature = signPayload(config.signingKey, fp, agentId);
|
|
60
|
+
}
|
|
61
|
+
// Demo mode
|
|
62
|
+
if (config.demo) {
|
|
63
|
+
const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-FAIL-${epoch}-${fp}`;
|
|
64
|
+
return [
|
|
65
|
+
`[DEMO MODE: local only, not persisted]`,
|
|
66
|
+
``,
|
|
67
|
+
`Violation Self-Reported`,
|
|
68
|
+
`Verdict: FAIL`,
|
|
69
|
+
`Anchor: ${demoAnchor}`,
|
|
70
|
+
`Procedure: ${procedureId}`,
|
|
71
|
+
`Type: ${args.violation_type}`,
|
|
72
|
+
`Severity: ${severity}`,
|
|
73
|
+
`Clearing Level: ${clearingLevel}`,
|
|
74
|
+
`Fingerprint: ${fp}`,
|
|
75
|
+
``,
|
|
76
|
+
`This anchor was minted locally. To persist anchors to the SWT3 ledger,`,
|
|
77
|
+
`use the signup tool to create a free account, or set SWT3_API_KEY.`,
|
|
78
|
+
].join("\n");
|
|
79
|
+
}
|
|
80
|
+
const receipt = await client.postWitness(payload);
|
|
81
|
+
if (receipt.tenant_id && !process.env.SWT3_TENANT_ID) {
|
|
82
|
+
config.tenantId = receipt.tenant_id;
|
|
83
|
+
}
|
|
84
|
+
return [
|
|
85
|
+
`Violation Self-Reported`,
|
|
86
|
+
`Verdict: ${receipt.verdict}`,
|
|
87
|
+
`Anchor: ${receipt.swt3_anchor}`,
|
|
88
|
+
`Procedure: ${receipt.procedure_id}`,
|
|
89
|
+
`Type: ${args.violation_type}`,
|
|
90
|
+
`Severity: ${severity}`,
|
|
91
|
+
`Clearing Level: ${receipt.clearing_level}`,
|
|
92
|
+
`Witnessed: ${receipt.witnessed_at}`,
|
|
93
|
+
`Verify: ${config.endpoint}${receipt.verification_url}`,
|
|
94
|
+
`Fingerprint: ${fp}`,
|
|
95
|
+
].join("\n");
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=violation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violation.js","sourceRoot":"","sources":["../../src/tools/violation.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/witness.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SWT3 MCP Server
|
|
2
|
+
* SWT3 MCP Server: witness_inference tool.
|
|
3
3
|
*
|
|
4
4
|
* Mints an SWT3 witness anchor for an AI inference. Accepts raw prompt/response
|
|
5
5
|
* text (hashed locally, never sent to server) or pre-computed hashes.
|
|
@@ -18,6 +18,11 @@ interface WitnessArgs {
|
|
|
18
18
|
clearing_level?: 0 | 1 | 2 | 3;
|
|
19
19
|
procedure?: string;
|
|
20
20
|
provider?: string;
|
|
21
|
+
agent_id?: string;
|
|
22
|
+
cycle_id?: string;
|
|
23
|
+
jurisdiction?: string;
|
|
24
|
+
legal_basis?: string;
|
|
25
|
+
purpose_class?: string;
|
|
21
26
|
}
|
|
22
27
|
export declare function handleWitness(args: WitnessArgs, config: McpConfig, client: AxiomClient): Promise<string>;
|
|
23
28
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAQhE,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"witness.d.ts","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,cAAc,CAAC;AAQhE,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,MAAM,CAAC,CAiHjB"}
|
package/dist/tools/witness.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SWT3 MCP Server
|
|
2
|
+
* SWT3 MCP Server: witness_inference tool.
|
|
3
3
|
*
|
|
4
4
|
* Mints an SWT3 witness anchor for an AI inference. Accepts raw prompt/response
|
|
5
5
|
* text (hashed locally, never sent to server) or pre-computed hashes.
|
|
@@ -53,18 +53,29 @@ export async function handleWitness(args, config, client) {
|
|
|
53
53
|
// Level 3: hash model_id
|
|
54
54
|
payload.ai_model_id = sha256Truncated(args.model_id);
|
|
55
55
|
}
|
|
56
|
+
// Source identification (allows server to distinguish SDK vs MCP traffic)
|
|
57
|
+
payload.witness_source = "mcp";
|
|
56
58
|
// Operational metadata (survives all clearing levels)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
+
const agentId = args.agent_id || config.agentId;
|
|
60
|
+
if (agentId)
|
|
61
|
+
payload.agent_id = agentId;
|
|
62
|
+
if (args.cycle_id)
|
|
63
|
+
payload.cycle_id = args.cycle_id;
|
|
64
|
+
if (args.jurisdiction)
|
|
65
|
+
payload.jurisdiction = args.jurisdiction;
|
|
66
|
+
if (args.legal_basis)
|
|
67
|
+
payload.legal_basis = args.legal_basis;
|
|
68
|
+
if (args.purpose_class)
|
|
69
|
+
payload.purpose_class = args.purpose_class;
|
|
59
70
|
if (config.signingKey) {
|
|
60
|
-
payload.payload_signature = signPayload(config.signingKey, fp,
|
|
71
|
+
payload.payload_signature = signPayload(config.signingKey, fp, agentId);
|
|
61
72
|
}
|
|
62
73
|
// Demo mode: mint locally, no network call
|
|
63
74
|
if (config.demo) {
|
|
64
75
|
const verdict = factorB >= factorA ? "PASS" : "FAIL";
|
|
65
76
|
const demoAnchor = `SWT3-DEMO-LOCAL-AI-${procedureId.replace(/[.-]/g, "")}-${verdict}-${epoch}-${fp}`;
|
|
66
77
|
return [
|
|
67
|
-
`[DEMO MODE
|
|
78
|
+
`[DEMO MODE: local only, not persisted]`,
|
|
68
79
|
``,
|
|
69
80
|
`Verdict: ${verdict}`,
|
|
70
81
|
`Anchor: ${demoAnchor}`,
|
|
@@ -75,6 +86,9 @@ export async function handleWitness(args, config, client) {
|
|
|
75
86
|
``,
|
|
76
87
|
`This anchor was minted locally. To persist anchors to the SWT3 ledger,`,
|
|
77
88
|
`use the signup tool to create a free account, or set SWT3_API_KEY.`,
|
|
89
|
+
``,
|
|
90
|
+
`Integrate directly: pip install swt3-ai | npm install @tenova/swt3-ai`,
|
|
91
|
+
`Also available in Rust, C#, and Ruby.`,
|
|
78
92
|
].join("\n");
|
|
79
93
|
}
|
|
80
94
|
// POST to witness endpoint
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"witness.js","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"witness.js","sourceRoot":"","sources":["../../src/tools/witness.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenova/swt3-mcp",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "MCP server for SWT3 AI Witness protocol — witness inferences, verify anchors, browse UCT registry",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,13 +25,27 @@
|
|
|
25
25
|
},
|
|
26
26
|
"keywords": [
|
|
27
27
|
"mcp",
|
|
28
|
+
"model-context-protocol",
|
|
28
29
|
"ai",
|
|
29
30
|
"compliance",
|
|
30
31
|
"witness",
|
|
31
32
|
"swt3",
|
|
32
33
|
"attestation",
|
|
33
34
|
"eu-ai-act",
|
|
34
|
-
"nist-ai-rmf"
|
|
35
|
+
"nist-ai-rmf",
|
|
36
|
+
"ai-governance",
|
|
37
|
+
"ai-audit",
|
|
38
|
+
"ai-accountability",
|
|
39
|
+
"ai-observability",
|
|
40
|
+
"llm-monitoring",
|
|
41
|
+
"compliance-as-code",
|
|
42
|
+
"responsible-ai",
|
|
43
|
+
"ai-safety",
|
|
44
|
+
"nist-800-53",
|
|
45
|
+
"cmmc",
|
|
46
|
+
"fedramp",
|
|
47
|
+
"cryptographic-attestation",
|
|
48
|
+
"audit-trail"
|
|
35
49
|
],
|
|
36
50
|
"author": "TeNova <engineering@tenovaai.com>",
|
|
37
51
|
"license": "Apache-2.0",
|
|
@@ -43,8 +57,17 @@
|
|
|
43
57
|
"dependencies": {
|
|
44
58
|
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
45
59
|
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"ioredis": "^5.0.0"
|
|
62
|
+
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"ioredis": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
46
68
|
"devDependencies": {
|
|
47
69
|
"@types/node": "^22.0.0",
|
|
70
|
+
"ioredis": "^5.6.1",
|
|
48
71
|
"typescript": "^5.5.0",
|
|
49
72
|
"vitest": "^4.1.2"
|
|
50
73
|
},
|