@aidprotocol/mcp-trust 1.0.0 → 1.0.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/dist/index.js ADDED
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ computeTrustScore: () => import_trust_compute.computeTrustScore,
24
+ getTrustVerdict: () => import_trust_compute.getTrustVerdict,
25
+ verifyTrustProof: () => import_trust_compute.verifyTrustProof,
26
+ withAidTrust: () => withAidTrust
27
+ });
28
+ module.exports = __toCommonJS(src_exports);
29
+ var import_trust_compute = require("@aidprotocol/trust-compute");
30
+ var TrustCache = class {
31
+ cache = /* @__PURE__ */ new Map();
32
+ ttlMs;
33
+ constructor(ttlSeconds) {
34
+ this.ttlMs = ttlSeconds * 1e3;
35
+ }
36
+ get(did) {
37
+ const entry = this.cache.get(did);
38
+ if (!entry)
39
+ return null;
40
+ if (Date.now() > entry.expiresAt) {
41
+ this.cache.delete(did);
42
+ return null;
43
+ }
44
+ return { ...entry.trust, cached: true };
45
+ }
46
+ set(did, trust) {
47
+ this.cache.set(did, {
48
+ trust,
49
+ expiresAt: Date.now() + this.ttlMs
50
+ });
51
+ if (this.cache.size > 1e4) {
52
+ const oldest = this.cache.keys().next().value;
53
+ if (oldest)
54
+ this.cache.delete(oldest);
55
+ }
56
+ }
57
+ clear() {
58
+ this.cache.clear();
59
+ }
60
+ };
61
+ async function fetchTrustFromApi(did, apiUrl) {
62
+ try {
63
+ const url = `${apiUrl}/v1/aid/${encodeURIComponent(did)}/trust`;
64
+ const res = await fetch(url, {
65
+ method: "GET",
66
+ headers: { "Accept": "application/json" },
67
+ signal: AbortSignal.timeout(5e3)
68
+ });
69
+ if (!res.ok)
70
+ return null;
71
+ const data = await res.json();
72
+ return {
73
+ score: data.trustScore ?? data.score ?? 0,
74
+ verdict: data.verdict ?? "new",
75
+ attestationCount: data.attestationCount ?? 0
76
+ };
77
+ } catch {
78
+ return null;
79
+ }
80
+ }
81
+ function withAidTrust(server, config) {
82
+ const {
83
+ providerDid,
84
+ minTrustScore = 0,
85
+ apiUrl = "https://api.claw-net.org",
86
+ failMode = "closed",
87
+ cacheTtlSeconds = 300,
88
+ onRejected,
89
+ onVerified
90
+ } = config;
91
+ const cache = new TrustCache(cacheTtlSeconds);
92
+ const requestTrust = /* @__PURE__ */ new WeakMap();
93
+ async function resolveTrust(did) {
94
+ const cached = cache.get(did);
95
+ if (cached)
96
+ return cached;
97
+ const apiResult = await fetchTrustFromApi(did, apiUrl);
98
+ if (!apiResult) {
99
+ if (failMode === "closed")
100
+ return null;
101
+ const fallback = {
102
+ did,
103
+ score: 0,
104
+ verdict: "new",
105
+ discount: 0,
106
+ settlementMode: "immediate",
107
+ cached: false,
108
+ resolvedAt: (/* @__PURE__ */ new Date()).toISOString()
109
+ };
110
+ return fallback;
111
+ }
112
+ const verdictResult = (0, import_trust_compute.getTrustVerdict)(apiResult.score);
113
+ const trust = {
114
+ did,
115
+ score: apiResult.score,
116
+ verdict: verdictResult.verdict,
117
+ discount: verdictResult.discount,
118
+ settlementMode: verdictResult.settlementMode,
119
+ cached: false,
120
+ resolvedAt: (/* @__PURE__ */ new Date()).toISOString()
121
+ };
122
+ cache.set(did, trust);
123
+ if (onVerified) {
124
+ onVerified(did, trust.score, trust.verdict);
125
+ }
126
+ return trust;
127
+ }
128
+ const originalTool = server.tool.bind(server);
129
+ server.tool = function wrappedTool(name, ...args) {
130
+ const handlerIndex = args.findIndex((a) => typeof a === "function");
131
+ if (handlerIndex === -1) {
132
+ return originalTool(name, ...args);
133
+ }
134
+ const originalHandler = args[handlerIndex];
135
+ args[handlerIndex] = async function trustedHandler(params, extra) {
136
+ let callerDid = null;
137
+ if (extra?.meta?.["X-AID-DID"]) {
138
+ callerDid = extra.meta["X-AID-DID"];
139
+ } else if (extra?.sessionId) {
140
+ callerDid = `session:${extra.sessionId}`;
141
+ }
142
+ if (callerDid && callerDid.startsWith("did:")) {
143
+ const trust = await resolveTrust(callerDid);
144
+ if (!trust) {
145
+ return {
146
+ content: [{
147
+ type: "text",
148
+ text: JSON.stringify({
149
+ error: "Trust verification failed",
150
+ code: "AID_TRUST_UNAVAILABLE",
151
+ detail: "Could not verify caller trust score. Try again later."
152
+ })
153
+ }],
154
+ isError: true
155
+ };
156
+ }
157
+ if (trust.score < minTrustScore) {
158
+ if (onRejected)
159
+ onRejected(callerDid, trust.score, minTrustScore);
160
+ return {
161
+ content: [{
162
+ type: "text",
163
+ text: JSON.stringify({
164
+ error: "Trust score too low",
165
+ code: "AID_TRUST_GATE_BLOCKED",
166
+ callerScore: trust.score,
167
+ requiredScore: minTrustScore,
168
+ verdict: trust.verdict,
169
+ detail: `Minimum trust score ${minTrustScore} required. Your score: ${trust.score} (${trust.verdict}).`
170
+ })
171
+ }],
172
+ isError: true
173
+ };
174
+ }
175
+ if (extra && typeof extra === "object") {
176
+ requestTrust.set(extra, trust);
177
+ }
178
+ }
179
+ return originalHandler(params, extra);
180
+ };
181
+ return originalTool(name, ...args);
182
+ };
183
+ return {
184
+ getCallerTrust(extra) {
185
+ if (!extra || typeof extra !== "object")
186
+ return null;
187
+ return requestTrust.get(extra) ?? null;
188
+ },
189
+ resolveTrust,
190
+ async meetsThreshold(did) {
191
+ const trust = await resolveTrust(did);
192
+ return trust !== null && trust.score >= minTrustScore;
193
+ },
194
+ provider: { did: providerDid, minTrustScore },
195
+ clearCache() {
196
+ cache.clear();
197
+ }
198
+ };
199
+ }
200
+ // Annotate the CommonJS export names for ESM import in node:
201
+ 0 && (module.exports = {
202
+ computeTrustScore,
203
+ getTrustVerdict,
204
+ verifyTrustProof,
205
+ withAidTrust
206
+ });
207
+ /**
208
+ * @aidprotocol/mcp-trust — Trust verification middleware for MCP servers
209
+ *
210
+ * Add trust scoring to any MCP server in one line.
211
+ * Verifies caller identity via Ed25519 signatures, resolves trust scores,
212
+ * and makes trust data available in every tool handler.
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
217
+ * import { withAidTrust } from '@aidprotocol/mcp-trust';
218
+ *
219
+ * const server = new McpServer({ name: 'my-api' });
220
+ *
221
+ * const aid = withAidTrust(server, {
222
+ * providerDid: 'did:key:zMyServerDid...',
223
+ * minTrustScore: 40,
224
+ * apiUrl: 'https://api.claw-net.org',
225
+ * });
226
+ *
227
+ * // Trust data available in tool context
228
+ * server.tool('get-data', { query: z.string() }, async (params, extra) => {
229
+ * const trust = aid.getCallerTrust(extra);
230
+ * console.log(trust?.score); // 87
231
+ * return { content: [{ type: 'text', text: 'result' }] };
232
+ * });
233
+ * ```
234
+ *
235
+ * @license MIT
236
+ */
237
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["/**\n * @aidprotocol/mcp-trust \u2014 Trust verification middleware for MCP servers\n *\n * Add trust scoring to any MCP server in one line.\n * Verifies caller identity via Ed25519 signatures, resolves trust scores,\n * and makes trust data available in every tool handler.\n *\n * @example\n * ```typescript\n * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n * import { withAidTrust } from '@aidprotocol/mcp-trust';\n *\n * const server = new McpServer({ name: 'my-api' });\n *\n * const aid = withAidTrust(server, {\n * providerDid: 'did:key:zMyServerDid...',\n * minTrustScore: 40,\n * apiUrl: 'https://api.claw-net.org',\n * });\n *\n * // Trust data available in tool context\n * server.tool('get-data', { query: z.string() }, async (params, extra) => {\n * const trust = aid.getCallerTrust(extra);\n * console.log(trust?.score); // 87\n * return { content: [{ type: 'text', text: 'result' }] };\n * });\n * ```\n *\n * @license MIT\n */\n\nimport { createHash, createVerify } from 'crypto';\nimport { computeTrustScore, getTrustVerdict, verifyTrustProof, jcsSerialize } from '@aidprotocol/trust-compute';\nimport type { TrustScoreProof, TrustVerdictResult, TrustStats } from '@aidprotocol/trust-compute';\n\n// Re-export trust-compute types for convenience\nexport type { TrustScoreProof, TrustVerdictResult, TrustStats };\nexport { computeTrustScore, getTrustVerdict, verifyTrustProof };\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface AidTrustConfig {\n /** The DID of this MCP server (did:key:z...) */\n providerDid: string;\n\n /** Minimum trust score required to call tools (0-100, default: 0) */\n minTrustScore?: number;\n\n /** ClawNet API URL for trust resolution (default: https://api.claw-net.org) */\n apiUrl?: string;\n\n /** Fail mode: 'closed' rejects on API failure, 'open' allows (default: 'closed') */\n failMode?: 'closed' | 'open';\n\n /** How long to cache trust scores in seconds (default: 300) */\n cacheTtlSeconds?: number;\n\n /** Optional callback when a caller is rejected for low trust */\n onRejected?: (callerDid: string, score: number, minRequired: number) => void;\n\n /** Optional callback when trust is verified */\n onVerified?: (callerDid: string, score: number, verdict: string) => void;\n}\n\nexport interface CallerTrust {\n /** Caller's DID (did:key:z...) */\n did: string;\n /** Trust score (0-100) */\n score: number;\n /** Trust verdict (new, building, caution, standard, trusted, proceed) */\n verdict: string;\n /** Pricing discount (0-0.30) */\n discount: number;\n /** Settlement mode */\n settlementMode: string;\n /** Whether the score was from cache */\n cached: boolean;\n /** When the score was resolved */\n resolvedAt: string;\n}\n\nexport interface AidTrustInstance {\n /** Get trust data for the current caller from tool handler context */\n getCallerTrust: (extra: any) => CallerTrust | null;\n\n /** Manually resolve trust for a DID */\n resolveTrust: (did: string) => Promise<CallerTrust | null>;\n\n /** Check if a DID meets the minimum trust threshold */\n meetsThreshold: (did: string) => Promise<boolean>;\n\n /** Get provider info */\n provider: { did: string; minTrustScore: number };\n\n /** Clear the trust cache */\n clearCache: () => void;\n}\n\n// \u2500\u2500\u2500 Trust Cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface CacheEntry {\n trust: CallerTrust;\n expiresAt: number;\n}\n\nclass TrustCache {\n private cache = new Map<string, CacheEntry>();\n private ttlMs: number;\n\n constructor(ttlSeconds: number) {\n this.ttlMs = ttlSeconds * 1000;\n }\n\n get(did: string): CallerTrust | null {\n const entry = this.cache.get(did);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(did);\n return null;\n }\n return { ...entry.trust, cached: true };\n }\n\n set(did: string, trust: CallerTrust): void {\n this.cache.set(did, {\n trust,\n expiresAt: Date.now() + this.ttlMs,\n });\n // Evict if cache grows too large (10K entries max)\n if (this.cache.size > 10000) {\n const oldest = this.cache.keys().next().value;\n if (oldest) this.cache.delete(oldest);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\n// \u2500\u2500\u2500 Trust Resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function fetchTrustFromApi(\n did: string,\n apiUrl: string,\n): Promise<{ score: number; verdict: string; attestationCount: number } | null> {\n try {\n const url = `${apiUrl}/v1/aid/${encodeURIComponent(did)}/trust`;\n const res = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return null;\n const data = await res.json() as any;\n return {\n score: data.trustScore ?? data.score ?? 0,\n verdict: data.verdict ?? 'new',\n attestationCount: data.attestationCount ?? 0,\n };\n } catch {\n return null;\n }\n}\n\n// \u2500\u2500\u2500 Main Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Add AID trust verification to an MCP server.\n *\n * This wraps the server to resolve trust for callers via X-AID-DID headers\n * or by querying ClawNet's trust API. Trust data is cached and available\n * in tool handlers via `aid.getCallerTrust(extra)`.\n *\n * @param server - The MCP server instance\n * @param config - Trust configuration\n * @returns An AidTrustInstance for querying trust data\n */\nexport function withAidTrust(server: any, config: AidTrustConfig): AidTrustInstance {\n const {\n providerDid,\n minTrustScore = 0,\n apiUrl = 'https://api.claw-net.org',\n failMode = 'closed',\n cacheTtlSeconds = 300,\n onRejected,\n onVerified,\n } = config;\n\n const cache = new TrustCache(cacheTtlSeconds);\n\n // Store trust data per-request using a WeakMap keyed on the extra object\n const requestTrust = new WeakMap<object, CallerTrust>();\n\n async function resolveTrust(did: string): Promise<CallerTrust | null> {\n // Check cache first\n const cached = cache.get(did);\n if (cached) return cached;\n\n // Fetch from API\n const apiResult = await fetchTrustFromApi(did, apiUrl);\n\n if (!apiResult) {\n if (failMode === 'closed') return null;\n // fail-open: return score 0 (base price, no discount)\n const fallback: CallerTrust = {\n did,\n score: 0,\n verdict: 'new',\n discount: 0,\n settlementMode: 'immediate',\n cached: false,\n resolvedAt: new Date().toISOString(),\n };\n return fallback;\n }\n\n const verdictResult = getTrustVerdict(apiResult.score);\n const trust: CallerTrust = {\n did,\n score: apiResult.score,\n verdict: verdictResult.verdict,\n discount: verdictResult.discount,\n settlementMode: verdictResult.settlementMode,\n cached: false,\n resolvedAt: new Date().toISOString(),\n };\n\n cache.set(did, trust);\n\n if (onVerified) {\n onVerified(did, trust.score, trust.verdict);\n }\n\n return trust;\n }\n\n // Wrap the server's tool method to inject trust resolution\n const originalTool = server.tool.bind(server);\n server.tool = function wrappedTool(name: string, ...args: any[]) {\n // Find the handler (last function argument)\n const handlerIndex = args.findIndex((a: any) => typeof a === 'function');\n if (handlerIndex === -1) {\n return originalTool(name, ...args);\n }\n\n const originalHandler = args[handlerIndex];\n args[handlerIndex] = async function trustedHandler(params: any, extra: any) {\n // Extract caller DID from transport metadata if available\n // MCP doesn't have standard auth headers yet \u2014 this is forward-compatible\n // with MCP-I when it ships. For now, check sessionId or custom metadata.\n let callerDid: string | null = null;\n\n // Check if caller provided DID via MCP metadata/params\n if (extra?.meta?.['X-AID-DID']) {\n callerDid = extra.meta['X-AID-DID'];\n } else if (extra?.sessionId) {\n // Use sessionId as a fallback identifier\n callerDid = `session:${extra.sessionId}`;\n }\n\n if (callerDid && callerDid.startsWith('did:')) {\n const trust = await resolveTrust(callerDid);\n\n if (!trust) {\n // Failed to resolve and failMode is 'closed'\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'Trust verification failed',\n code: 'AID_TRUST_UNAVAILABLE',\n detail: 'Could not verify caller trust score. Try again later.',\n }),\n }],\n isError: true,\n };\n }\n\n if (trust.score < minTrustScore) {\n if (onRejected) onRejected(callerDid, trust.score, minTrustScore);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'Trust score too low',\n code: 'AID_TRUST_GATE_BLOCKED',\n callerScore: trust.score,\n requiredScore: minTrustScore,\n verdict: trust.verdict,\n detail: `Minimum trust score ${minTrustScore} required. Your score: ${trust.score} (${trust.verdict}).`,\n }),\n }],\n isError: true,\n };\n }\n\n // Store trust for retrieval via getCallerTrust\n if (extra && typeof extra === 'object') {\n requestTrust.set(extra, trust);\n }\n }\n\n return originalHandler(params, extra);\n };\n\n return originalTool(name, ...args);\n };\n\n return {\n getCallerTrust(extra: any): CallerTrust | null {\n if (!extra || typeof extra !== 'object') return null;\n return requestTrust.get(extra) ?? null;\n },\n\n resolveTrust,\n\n async meetsThreshold(did: string): Promise<boolean> {\n const trust = await resolveTrust(did);\n return trust !== null && trust.score >= minTrustScore;\n },\n\n provider: { did: providerDid, minTrustScore },\n\n clearCache() {\n cache.clear();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/index.mjs ADDED
@@ -0,0 +1,209 @@
1
+ // src/index.ts
2
+ import { computeTrustScore, getTrustVerdict, verifyTrustProof } from "@aidprotocol/trust-compute";
3
+ var TrustCache = class {
4
+ cache = /* @__PURE__ */ new Map();
5
+ ttlMs;
6
+ constructor(ttlSeconds) {
7
+ this.ttlMs = ttlSeconds * 1e3;
8
+ }
9
+ get(did) {
10
+ const entry = this.cache.get(did);
11
+ if (!entry)
12
+ return null;
13
+ if (Date.now() > entry.expiresAt) {
14
+ this.cache.delete(did);
15
+ return null;
16
+ }
17
+ return { ...entry.trust, cached: true };
18
+ }
19
+ set(did, trust) {
20
+ this.cache.set(did, {
21
+ trust,
22
+ expiresAt: Date.now() + this.ttlMs
23
+ });
24
+ if (this.cache.size > 1e4) {
25
+ const oldest = this.cache.keys().next().value;
26
+ if (oldest)
27
+ this.cache.delete(oldest);
28
+ }
29
+ }
30
+ clear() {
31
+ this.cache.clear();
32
+ }
33
+ };
34
+ async function fetchTrustFromApi(did, apiUrl) {
35
+ try {
36
+ const url = `${apiUrl}/v1/aid/${encodeURIComponent(did)}/trust`;
37
+ const res = await fetch(url, {
38
+ method: "GET",
39
+ headers: { "Accept": "application/json" },
40
+ signal: AbortSignal.timeout(5e3)
41
+ });
42
+ if (!res.ok)
43
+ return null;
44
+ const data = await res.json();
45
+ return {
46
+ score: data.trustScore ?? data.score ?? 0,
47
+ verdict: data.verdict ?? "new",
48
+ attestationCount: data.attestationCount ?? 0
49
+ };
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+ function withAidTrust(server, config) {
55
+ const {
56
+ providerDid,
57
+ minTrustScore = 0,
58
+ apiUrl = "https://api.claw-net.org",
59
+ failMode = "closed",
60
+ cacheTtlSeconds = 300,
61
+ onRejected,
62
+ onVerified
63
+ } = config;
64
+ const cache = new TrustCache(cacheTtlSeconds);
65
+ const requestTrust = /* @__PURE__ */ new WeakMap();
66
+ async function resolveTrust(did) {
67
+ const cached = cache.get(did);
68
+ if (cached)
69
+ return cached;
70
+ const apiResult = await fetchTrustFromApi(did, apiUrl);
71
+ if (!apiResult) {
72
+ if (failMode === "closed")
73
+ return null;
74
+ const fallback = {
75
+ did,
76
+ score: 0,
77
+ verdict: "new",
78
+ discount: 0,
79
+ settlementMode: "immediate",
80
+ cached: false,
81
+ resolvedAt: (/* @__PURE__ */ new Date()).toISOString()
82
+ };
83
+ return fallback;
84
+ }
85
+ const verdictResult = getTrustVerdict(apiResult.score);
86
+ const trust = {
87
+ did,
88
+ score: apiResult.score,
89
+ verdict: verdictResult.verdict,
90
+ discount: verdictResult.discount,
91
+ settlementMode: verdictResult.settlementMode,
92
+ cached: false,
93
+ resolvedAt: (/* @__PURE__ */ new Date()).toISOString()
94
+ };
95
+ cache.set(did, trust);
96
+ if (onVerified) {
97
+ onVerified(did, trust.score, trust.verdict);
98
+ }
99
+ return trust;
100
+ }
101
+ const originalTool = server.tool.bind(server);
102
+ server.tool = function wrappedTool(name, ...args) {
103
+ const handlerIndex = args.findIndex((a) => typeof a === "function");
104
+ if (handlerIndex === -1) {
105
+ return originalTool(name, ...args);
106
+ }
107
+ const originalHandler = args[handlerIndex];
108
+ args[handlerIndex] = async function trustedHandler(params, extra) {
109
+ let callerDid = null;
110
+ if (extra?.meta?.["X-AID-DID"]) {
111
+ callerDid = extra.meta["X-AID-DID"];
112
+ } else if (extra?.sessionId) {
113
+ callerDid = `session:${extra.sessionId}`;
114
+ }
115
+ if (callerDid && callerDid.startsWith("did:")) {
116
+ const trust = await resolveTrust(callerDid);
117
+ if (!trust) {
118
+ return {
119
+ content: [{
120
+ type: "text",
121
+ text: JSON.stringify({
122
+ error: "Trust verification failed",
123
+ code: "AID_TRUST_UNAVAILABLE",
124
+ detail: "Could not verify caller trust score. Try again later."
125
+ })
126
+ }],
127
+ isError: true
128
+ };
129
+ }
130
+ if (trust.score < minTrustScore) {
131
+ if (onRejected)
132
+ onRejected(callerDid, trust.score, minTrustScore);
133
+ return {
134
+ content: [{
135
+ type: "text",
136
+ text: JSON.stringify({
137
+ error: "Trust score too low",
138
+ code: "AID_TRUST_GATE_BLOCKED",
139
+ callerScore: trust.score,
140
+ requiredScore: minTrustScore,
141
+ verdict: trust.verdict,
142
+ detail: `Minimum trust score ${minTrustScore} required. Your score: ${trust.score} (${trust.verdict}).`
143
+ })
144
+ }],
145
+ isError: true
146
+ };
147
+ }
148
+ if (extra && typeof extra === "object") {
149
+ requestTrust.set(extra, trust);
150
+ }
151
+ }
152
+ return originalHandler(params, extra);
153
+ };
154
+ return originalTool(name, ...args);
155
+ };
156
+ return {
157
+ getCallerTrust(extra) {
158
+ if (!extra || typeof extra !== "object")
159
+ return null;
160
+ return requestTrust.get(extra) ?? null;
161
+ },
162
+ resolveTrust,
163
+ async meetsThreshold(did) {
164
+ const trust = await resolveTrust(did);
165
+ return trust !== null && trust.score >= minTrustScore;
166
+ },
167
+ provider: { did: providerDid, minTrustScore },
168
+ clearCache() {
169
+ cache.clear();
170
+ }
171
+ };
172
+ }
173
+ export {
174
+ computeTrustScore,
175
+ getTrustVerdict,
176
+ verifyTrustProof,
177
+ withAidTrust
178
+ };
179
+ /**
180
+ * @aidprotocol/mcp-trust — Trust verification middleware for MCP servers
181
+ *
182
+ * Add trust scoring to any MCP server in one line.
183
+ * Verifies caller identity via Ed25519 signatures, resolves trust scores,
184
+ * and makes trust data available in every tool handler.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
189
+ * import { withAidTrust } from '@aidprotocol/mcp-trust';
190
+ *
191
+ * const server = new McpServer({ name: 'my-api' });
192
+ *
193
+ * const aid = withAidTrust(server, {
194
+ * providerDid: 'did:key:zMyServerDid...',
195
+ * minTrustScore: 40,
196
+ * apiUrl: 'https://api.claw-net.org',
197
+ * });
198
+ *
199
+ * // Trust data available in tool context
200
+ * server.tool('get-data', { query: z.string() }, async (params, extra) => {
201
+ * const trust = aid.getCallerTrust(extra);
202
+ * console.log(trust?.score); // 87
203
+ * return { content: [{ type: 'text', text: 'result' }] };
204
+ * });
205
+ * ```
206
+ *
207
+ * @license MIT
208
+ */
209
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["/**\n * @aidprotocol/mcp-trust \u2014 Trust verification middleware for MCP servers\n *\n * Add trust scoring to any MCP server in one line.\n * Verifies caller identity via Ed25519 signatures, resolves trust scores,\n * and makes trust data available in every tool handler.\n *\n * @example\n * ```typescript\n * import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\n * import { withAidTrust } from '@aidprotocol/mcp-trust';\n *\n * const server = new McpServer({ name: 'my-api' });\n *\n * const aid = withAidTrust(server, {\n * providerDid: 'did:key:zMyServerDid...',\n * minTrustScore: 40,\n * apiUrl: 'https://api.claw-net.org',\n * });\n *\n * // Trust data available in tool context\n * server.tool('get-data', { query: z.string() }, async (params, extra) => {\n * const trust = aid.getCallerTrust(extra);\n * console.log(trust?.score); // 87\n * return { content: [{ type: 'text', text: 'result' }] };\n * });\n * ```\n *\n * @license MIT\n */\n\nimport { createHash, createVerify } from 'crypto';\nimport { computeTrustScore, getTrustVerdict, verifyTrustProof, jcsSerialize } from '@aidprotocol/trust-compute';\nimport type { TrustScoreProof, TrustVerdictResult, TrustStats } from '@aidprotocol/trust-compute';\n\n// Re-export trust-compute types for convenience\nexport type { TrustScoreProof, TrustVerdictResult, TrustStats };\nexport { computeTrustScore, getTrustVerdict, verifyTrustProof };\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface AidTrustConfig {\n /** The DID of this MCP server (did:key:z...) */\n providerDid: string;\n\n /** Minimum trust score required to call tools (0-100, default: 0) */\n minTrustScore?: number;\n\n /** ClawNet API URL for trust resolution (default: https://api.claw-net.org) */\n apiUrl?: string;\n\n /** Fail mode: 'closed' rejects on API failure, 'open' allows (default: 'closed') */\n failMode?: 'closed' | 'open';\n\n /** How long to cache trust scores in seconds (default: 300) */\n cacheTtlSeconds?: number;\n\n /** Optional callback when a caller is rejected for low trust */\n onRejected?: (callerDid: string, score: number, minRequired: number) => void;\n\n /** Optional callback when trust is verified */\n onVerified?: (callerDid: string, score: number, verdict: string) => void;\n}\n\nexport interface CallerTrust {\n /** Caller's DID (did:key:z...) */\n did: string;\n /** Trust score (0-100) */\n score: number;\n /** Trust verdict (new, building, caution, standard, trusted, proceed) */\n verdict: string;\n /** Pricing discount (0-0.30) */\n discount: number;\n /** Settlement mode */\n settlementMode: string;\n /** Whether the score was from cache */\n cached: boolean;\n /** When the score was resolved */\n resolvedAt: string;\n}\n\nexport interface AidTrustInstance {\n /** Get trust data for the current caller from tool handler context */\n getCallerTrust: (extra: any) => CallerTrust | null;\n\n /** Manually resolve trust for a DID */\n resolveTrust: (did: string) => Promise<CallerTrust | null>;\n\n /** Check if a DID meets the minimum trust threshold */\n meetsThreshold: (did: string) => Promise<boolean>;\n\n /** Get provider info */\n provider: { did: string; minTrustScore: number };\n\n /** Clear the trust cache */\n clearCache: () => void;\n}\n\n// \u2500\u2500\u2500 Trust Cache \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface CacheEntry {\n trust: CallerTrust;\n expiresAt: number;\n}\n\nclass TrustCache {\n private cache = new Map<string, CacheEntry>();\n private ttlMs: number;\n\n constructor(ttlSeconds: number) {\n this.ttlMs = ttlSeconds * 1000;\n }\n\n get(did: string): CallerTrust | null {\n const entry = this.cache.get(did);\n if (!entry) return null;\n if (Date.now() > entry.expiresAt) {\n this.cache.delete(did);\n return null;\n }\n return { ...entry.trust, cached: true };\n }\n\n set(did: string, trust: CallerTrust): void {\n this.cache.set(did, {\n trust,\n expiresAt: Date.now() + this.ttlMs,\n });\n // Evict if cache grows too large (10K entries max)\n if (this.cache.size > 10000) {\n const oldest = this.cache.keys().next().value;\n if (oldest) this.cache.delete(oldest);\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n}\n\n// \u2500\u2500\u2500 Trust Resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function fetchTrustFromApi(\n did: string,\n apiUrl: string,\n): Promise<{ score: number; verdict: string; attestationCount: number } | null> {\n try {\n const url = `${apiUrl}/v1/aid/${encodeURIComponent(did)}/trust`;\n const res = await fetch(url, {\n method: 'GET',\n headers: { 'Accept': 'application/json' },\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return null;\n const data = await res.json() as any;\n return {\n score: data.trustScore ?? data.score ?? 0,\n verdict: data.verdict ?? 'new',\n attestationCount: data.attestationCount ?? 0,\n };\n } catch {\n return null;\n }\n}\n\n// \u2500\u2500\u2500 Main Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Add AID trust verification to an MCP server.\n *\n * This wraps the server to resolve trust for callers via X-AID-DID headers\n * or by querying ClawNet's trust API. Trust data is cached and available\n * in tool handlers via `aid.getCallerTrust(extra)`.\n *\n * @param server - The MCP server instance\n * @param config - Trust configuration\n * @returns An AidTrustInstance for querying trust data\n */\nexport function withAidTrust(server: any, config: AidTrustConfig): AidTrustInstance {\n const {\n providerDid,\n minTrustScore = 0,\n apiUrl = 'https://api.claw-net.org',\n failMode = 'closed',\n cacheTtlSeconds = 300,\n onRejected,\n onVerified,\n } = config;\n\n const cache = new TrustCache(cacheTtlSeconds);\n\n // Store trust data per-request using a WeakMap keyed on the extra object\n const requestTrust = new WeakMap<object, CallerTrust>();\n\n async function resolveTrust(did: string): Promise<CallerTrust | null> {\n // Check cache first\n const cached = cache.get(did);\n if (cached) return cached;\n\n // Fetch from API\n const apiResult = await fetchTrustFromApi(did, apiUrl);\n\n if (!apiResult) {\n if (failMode === 'closed') return null;\n // fail-open: return score 0 (base price, no discount)\n const fallback: CallerTrust = {\n did,\n score: 0,\n verdict: 'new',\n discount: 0,\n settlementMode: 'immediate',\n cached: false,\n resolvedAt: new Date().toISOString(),\n };\n return fallback;\n }\n\n const verdictResult = getTrustVerdict(apiResult.score);\n const trust: CallerTrust = {\n did,\n score: apiResult.score,\n verdict: verdictResult.verdict,\n discount: verdictResult.discount,\n settlementMode: verdictResult.settlementMode,\n cached: false,\n resolvedAt: new Date().toISOString(),\n };\n\n cache.set(did, trust);\n\n if (onVerified) {\n onVerified(did, trust.score, trust.verdict);\n }\n\n return trust;\n }\n\n // Wrap the server's tool method to inject trust resolution\n const originalTool = server.tool.bind(server);\n server.tool = function wrappedTool(name: string, ...args: any[]) {\n // Find the handler (last function argument)\n const handlerIndex = args.findIndex((a: any) => typeof a === 'function');\n if (handlerIndex === -1) {\n return originalTool(name, ...args);\n }\n\n const originalHandler = args[handlerIndex];\n args[handlerIndex] = async function trustedHandler(params: any, extra: any) {\n // Extract caller DID from transport metadata if available\n // MCP doesn't have standard auth headers yet \u2014 this is forward-compatible\n // with MCP-I when it ships. For now, check sessionId or custom metadata.\n let callerDid: string | null = null;\n\n // Check if caller provided DID via MCP metadata/params\n if (extra?.meta?.['X-AID-DID']) {\n callerDid = extra.meta['X-AID-DID'];\n } else if (extra?.sessionId) {\n // Use sessionId as a fallback identifier\n callerDid = `session:${extra.sessionId}`;\n }\n\n if (callerDid && callerDid.startsWith('did:')) {\n const trust = await resolveTrust(callerDid);\n\n if (!trust) {\n // Failed to resolve and failMode is 'closed'\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'Trust verification failed',\n code: 'AID_TRUST_UNAVAILABLE',\n detail: 'Could not verify caller trust score. Try again later.',\n }),\n }],\n isError: true,\n };\n }\n\n if (trust.score < minTrustScore) {\n if (onRejected) onRejected(callerDid, trust.score, minTrustScore);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n error: 'Trust score too low',\n code: 'AID_TRUST_GATE_BLOCKED',\n callerScore: trust.score,\n requiredScore: minTrustScore,\n verdict: trust.verdict,\n detail: `Minimum trust score ${minTrustScore} required. Your score: ${trust.score} (${trust.verdict}).`,\n }),\n }],\n isError: true,\n };\n }\n\n // Store trust for retrieval via getCallerTrust\n if (extra && typeof extra === 'object') {\n requestTrust.set(extra, trust);\n }\n }\n\n return originalHandler(params, extra);\n };\n\n return originalTool(name, ...args);\n };\n\n return {\n getCallerTrust(extra: any): CallerTrust | null {\n if (!extra || typeof extra !== 'object') return null;\n return requestTrust.get(extra) ?? null;\n },\n\n resolveTrust,\n\n async meetsThreshold(did: string): Promise<boolean> {\n const trust = await resolveTrust(did);\n return trust !== null && trust.score >= minTrustScore;\n },\n\n provider: { did: providerDid, minTrustScore },\n\n clearCache() {\n cache.clear();\n },\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,12 +1,38 @@
1
1
  {
2
2
  "name": "@aidprotocol/mcp-trust",
3
- "version": "1.0.0",
4
- "description": "",
5
- "main": "index.js",
3
+ "version": "1.0.1",
4
+ "description": "Trust verification middleware for MCP servers — add AID trust scoring in one line",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "files": ["dist/", "README.md"],
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
6
16
  "scripts": {
7
- "test": "echo \"Error: no test specified\" && exit 1"
17
+ "build": "node build.mjs",
18
+ "prepublishOnly": "npm run build"
19
+ },
20
+ "keywords": [
21
+ "mcp", "trust", "aid", "agent", "identity", "reputation",
22
+ "middleware", "verification", "ed25519", "did", "agentic-commerce",
23
+ "model-context-protocol", "a2a"
24
+ ],
25
+ "license": "MIT",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/1xmint/claw-net",
29
+ "directory": "packages/mcp-trust"
30
+ },
31
+ "homepage": "https://claw-net.org",
32
+ "dependencies": {
33
+ "@aidprotocol/trust-compute": "^1.0.1"
8
34
  },
9
- "keywords": [],
10
- "author": "",
11
- "license": "ISC"
35
+ "devDependencies": {
36
+ "esbuild": "^0.20.0"
37
+ }
12
38
  }