@kya-os/mcp 1.2.0

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.
Files changed (182) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/LICENSE +21 -0
  3. package/README.md +135 -0
  4. package/dist/auth/handshake.d.ts +119 -0
  5. package/dist/auth/handshake.d.ts.map +1 -0
  6. package/dist/auth/handshake.js +267 -0
  7. package/dist/auth/handshake.js.map +1 -0
  8. package/dist/auth/index.d.ts +3 -0
  9. package/dist/auth/index.d.ts.map +1 -0
  10. package/dist/auth/index.js +2 -0
  11. package/dist/auth/index.js.map +1 -0
  12. package/dist/auth/types.d.ts +31 -0
  13. package/dist/auth/types.d.ts.map +1 -0
  14. package/dist/auth/types.js +7 -0
  15. package/dist/auth/types.js.map +1 -0
  16. package/dist/delegation/audience-validator.d.ts +9 -0
  17. package/dist/delegation/audience-validator.d.ts.map +1 -0
  18. package/dist/delegation/audience-validator.js +17 -0
  19. package/dist/delegation/audience-validator.js.map +1 -0
  20. package/dist/delegation/bitstring.d.ts +37 -0
  21. package/dist/delegation/bitstring.d.ts.map +1 -0
  22. package/dist/delegation/bitstring.js +117 -0
  23. package/dist/delegation/bitstring.js.map +1 -0
  24. package/dist/delegation/cascading-revocation.d.ts +45 -0
  25. package/dist/delegation/cascading-revocation.d.ts.map +1 -0
  26. package/dist/delegation/cascading-revocation.js +150 -0
  27. package/dist/delegation/cascading-revocation.js.map +1 -0
  28. package/dist/delegation/delegation-graph.d.ts +49 -0
  29. package/dist/delegation/delegation-graph.d.ts.map +1 -0
  30. package/dist/delegation/delegation-graph.js +99 -0
  31. package/dist/delegation/delegation-graph.js.map +1 -0
  32. package/dist/delegation/did-key-resolver.d.ts +64 -0
  33. package/dist/delegation/did-key-resolver.d.ts.map +1 -0
  34. package/dist/delegation/did-key-resolver.js +157 -0
  35. package/dist/delegation/did-key-resolver.js.map +1 -0
  36. package/dist/delegation/did-web-resolver.d.ts +83 -0
  37. package/dist/delegation/did-web-resolver.d.ts.map +1 -0
  38. package/dist/delegation/did-web-resolver.js +218 -0
  39. package/dist/delegation/did-web-resolver.js.map +1 -0
  40. package/dist/delegation/index.d.ts +21 -0
  41. package/dist/delegation/index.d.ts.map +1 -0
  42. package/dist/delegation/index.js +21 -0
  43. package/dist/delegation/index.js.map +1 -0
  44. package/dist/delegation/outbound-headers.d.ts +79 -0
  45. package/dist/delegation/outbound-headers.d.ts.map +1 -0
  46. package/dist/delegation/outbound-headers.js +138 -0
  47. package/dist/delegation/outbound-headers.js.map +1 -0
  48. package/dist/delegation/outbound-proof.d.ts +43 -0
  49. package/dist/delegation/outbound-proof.d.ts.map +1 -0
  50. package/dist/delegation/outbound-proof.js +52 -0
  51. package/dist/delegation/outbound-proof.js.map +1 -0
  52. package/dist/delegation/statuslist-manager.d.ts +47 -0
  53. package/dist/delegation/statuslist-manager.d.ts.map +1 -0
  54. package/dist/delegation/statuslist-manager.js +139 -0
  55. package/dist/delegation/statuslist-manager.js.map +1 -0
  56. package/dist/delegation/storage/memory-graph-storage.d.ts +70 -0
  57. package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -0
  58. package/dist/delegation/storage/memory-graph-storage.js +145 -0
  59. package/dist/delegation/storage/memory-graph-storage.js.map +1 -0
  60. package/dist/delegation/storage/memory-statuslist-storage.d.ts +19 -0
  61. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -0
  62. package/dist/delegation/storage/memory-statuslist-storage.js +33 -0
  63. package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -0
  64. package/dist/delegation/utils.d.ts +49 -0
  65. package/dist/delegation/utils.d.ts.map +1 -0
  66. package/dist/delegation/utils.js +131 -0
  67. package/dist/delegation/utils.js.map +1 -0
  68. package/dist/delegation/vc-issuer.d.ts +56 -0
  69. package/dist/delegation/vc-issuer.d.ts.map +1 -0
  70. package/dist/delegation/vc-issuer.js +80 -0
  71. package/dist/delegation/vc-issuer.js.map +1 -0
  72. package/dist/delegation/vc-verifier.d.ts +112 -0
  73. package/dist/delegation/vc-verifier.d.ts.map +1 -0
  74. package/dist/delegation/vc-verifier.js +280 -0
  75. package/dist/delegation/vc-verifier.js.map +1 -0
  76. package/dist/errors.d.ts +42 -0
  77. package/dist/errors.d.ts.map +1 -0
  78. package/dist/errors.js +45 -0
  79. package/dist/errors.js.map +1 -0
  80. package/dist/index.d.ts +47 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +56 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/logging/index.d.ts +2 -0
  85. package/dist/logging/index.d.ts.map +1 -0
  86. package/dist/logging/index.js +2 -0
  87. package/dist/logging/index.js.map +1 -0
  88. package/dist/logging/logger.d.ts +23 -0
  89. package/dist/logging/logger.d.ts.map +1 -0
  90. package/dist/logging/logger.js +82 -0
  91. package/dist/logging/logger.js.map +1 -0
  92. package/dist/middleware/index.d.ts +12 -0
  93. package/dist/middleware/index.d.ts.map +1 -0
  94. package/dist/middleware/index.js +12 -0
  95. package/dist/middleware/index.js.map +1 -0
  96. package/dist/middleware/mcpi-transport.d.ts +39 -0
  97. package/dist/middleware/mcpi-transport.d.ts.map +1 -0
  98. package/dist/middleware/mcpi-transport.js +121 -0
  99. package/dist/middleware/mcpi-transport.js.map +1 -0
  100. package/dist/middleware/with-mcpi-server.d.ts +78 -0
  101. package/dist/middleware/with-mcpi-server.d.ts.map +1 -0
  102. package/dist/middleware/with-mcpi-server.js +109 -0
  103. package/dist/middleware/with-mcpi-server.js.map +1 -0
  104. package/dist/middleware/with-mcpi.d.ts +202 -0
  105. package/dist/middleware/with-mcpi.d.ts.map +1 -0
  106. package/dist/middleware/with-mcpi.js +625 -0
  107. package/dist/middleware/with-mcpi.js.map +1 -0
  108. package/dist/proof/errors.d.ts +49 -0
  109. package/dist/proof/errors.d.ts.map +1 -0
  110. package/dist/proof/errors.js +61 -0
  111. package/dist/proof/errors.js.map +1 -0
  112. package/dist/proof/generator.d.ts +65 -0
  113. package/dist/proof/generator.d.ts.map +1 -0
  114. package/dist/proof/generator.js +163 -0
  115. package/dist/proof/generator.js.map +1 -0
  116. package/dist/proof/index.d.ts +4 -0
  117. package/dist/proof/index.d.ts.map +1 -0
  118. package/dist/proof/index.js +4 -0
  119. package/dist/proof/index.js.map +1 -0
  120. package/dist/proof/verifier.d.ts +108 -0
  121. package/dist/proof/verifier.d.ts.map +1 -0
  122. package/dist/proof/verifier.js +299 -0
  123. package/dist/proof/verifier.js.map +1 -0
  124. package/dist/providers/base.d.ts +64 -0
  125. package/dist/providers/base.d.ts.map +1 -0
  126. package/dist/providers/base.js +19 -0
  127. package/dist/providers/base.js.map +1 -0
  128. package/dist/providers/index.d.ts +4 -0
  129. package/dist/providers/index.d.ts.map +1 -0
  130. package/dist/providers/index.js +4 -0
  131. package/dist/providers/index.js.map +1 -0
  132. package/dist/providers/memory.d.ts +33 -0
  133. package/dist/providers/memory.d.ts.map +1 -0
  134. package/dist/providers/memory.js +102 -0
  135. package/dist/providers/memory.js.map +1 -0
  136. package/dist/providers/node-crypto.d.ts +26 -0
  137. package/dist/providers/node-crypto.d.ts.map +1 -0
  138. package/dist/providers/node-crypto.js +69 -0
  139. package/dist/providers/node-crypto.js.map +1 -0
  140. package/dist/session/index.d.ts +2 -0
  141. package/dist/session/index.d.ts.map +1 -0
  142. package/dist/session/index.js +2 -0
  143. package/dist/session/index.js.map +1 -0
  144. package/dist/session/manager.d.ts +83 -0
  145. package/dist/session/manager.d.ts.map +1 -0
  146. package/dist/session/manager.js +267 -0
  147. package/dist/session/manager.js.map +1 -0
  148. package/dist/types/protocol.d.ts +320 -0
  149. package/dist/types/protocol.d.ts.map +1 -0
  150. package/dist/types/protocol.js +229 -0
  151. package/dist/types/protocol.js.map +1 -0
  152. package/dist/utils/base58.d.ts +31 -0
  153. package/dist/utils/base58.d.ts.map +1 -0
  154. package/dist/utils/base58.js +104 -0
  155. package/dist/utils/base58.js.map +1 -0
  156. package/dist/utils/base64.d.ts +13 -0
  157. package/dist/utils/base64.d.ts.map +1 -0
  158. package/dist/utils/base64.js +99 -0
  159. package/dist/utils/base64.js.map +1 -0
  160. package/dist/utils/crypto-service.d.ts +37 -0
  161. package/dist/utils/crypto-service.d.ts.map +1 -0
  162. package/dist/utils/crypto-service.js +154 -0
  163. package/dist/utils/crypto-service.js.map +1 -0
  164. package/dist/utils/did-helpers.d.ts +168 -0
  165. package/dist/utils/did-helpers.d.ts.map +1 -0
  166. package/dist/utils/did-helpers.js +211 -0
  167. package/dist/utils/did-helpers.js.map +1 -0
  168. package/dist/utils/ed25519-constants.d.ts +18 -0
  169. package/dist/utils/ed25519-constants.d.ts.map +1 -0
  170. package/dist/utils/ed25519-constants.js +21 -0
  171. package/dist/utils/ed25519-constants.js.map +1 -0
  172. package/dist/utils/index.d.ts +5 -0
  173. package/dist/utils/index.d.ts.map +1 -0
  174. package/dist/utils/index.js +5 -0
  175. package/dist/utils/index.js.map +1 -0
  176. package/package.json +115 -0
  177. package/schemas/README.md +117 -0
  178. package/schemas/delegation-credential.json +312 -0
  179. package/schemas/detached-proof.json +97 -0
  180. package/schemas/handshake-request.json +84 -0
  181. package/schemas/handshake-response.json +67 -0
  182. package/schemas/well-known-mcpi.json +176 -0
@@ -0,0 +1,625 @@
1
+ /**
2
+ * MCP-I Middleware — Core Implementation
3
+ *
4
+ * Adds identity, session management, and proof generation to MCP servers.
5
+ *
6
+ * For most use cases, prefer the high-level `withMCPI()` adapter from
7
+ * `./with-mcpi-server.ts` which (by default) auto-registers the handshake
8
+ * tool and auto-attaches proofs to all tool responses:
9
+ *
10
+ * import { withMCPI } from '@kya-os/mcp';
11
+ * await withMCPI(server, { crypto: new NodeCryptoProvider() });
12
+ *
13
+ * `createMCPIMiddleware()` in this file is the lower-level API used
14
+ * internally by `withMCPI()` and for advanced use cases like the
15
+ * low-level `Server` API or custom request handler patterns.
16
+ */
17
+ import { FetchProvider, } from "../providers/base.js";
18
+ import { SessionManager, } from "../session/manager.js";
19
+ import { ProofGenerator, } from "../proof/generator.js";
20
+ import { validateHandshakeFormat } from "../session/manager.js";
21
+ import { DelegationCredentialVerifier, } from "../delegation/vc-verifier.js";
22
+ import { createDidKeyResolver } from "../delegation/did-key-resolver.js";
23
+ import { createDidWebResolver } from "../delegation/did-web-resolver.js";
24
+ import { verifyDelegationAudience } from "../delegation/audience-validator.js";
25
+ import { createNeedsAuthorizationError, extractDelegationFromVC, } from "../types/protocol.js";
26
+ import { logger } from "../logging/index.js";
27
+ import { MCPI_ERROR_CODES } from "../errors.js";
28
+ import { canonicalizeJSON, parseVCJWT } from "../delegation/utils.js";
29
+ import { base64urlDecodeToBytes, base64urlEncodeFromBytes, bytesToBase64 } from "../utils/base64.js";
30
+ export const MCPI_ACTIONS = ["handshake", "identity", "reputation"];
31
+ class RuntimeFetchProvider extends FetchProvider {
32
+ async resolveDID() {
33
+ return null;
34
+ }
35
+ async fetchStatusList() {
36
+ return null;
37
+ }
38
+ async fetchDelegationChain() {
39
+ return [];
40
+ }
41
+ async fetch(url, options) {
42
+ if (typeof globalThis.fetch !== "function") {
43
+ throw new Error("Global fetch is not available in this runtime");
44
+ }
45
+ return globalThis.fetch(url, options);
46
+ }
47
+ }
48
+ function getDelegationScopes(credential) {
49
+ const scopes = new Set();
50
+ for (const scope of credential.credentialSubject.delegation.scopes ?? []) {
51
+ scopes.add(scope);
52
+ }
53
+ for (const scope of credential.credentialSubject.delegation.constraints.scopes ?? []) {
54
+ scopes.add(scope);
55
+ }
56
+ return Array.from(scopes);
57
+ }
58
+ function validateScopeAttenuation(parentCredential, childCredential) {
59
+ const parentScopes = getDelegationScopes(parentCredential);
60
+ const childScopes = getDelegationScopes(childCredential);
61
+ const childDelegation = childCredential.credentialSubject.delegation;
62
+ if (parentScopes.length === 0) {
63
+ return { valid: true };
64
+ }
65
+ if (childScopes.length === 0) {
66
+ return {
67
+ valid: false,
68
+ reason: `Delegation ${childDelegation.id} omits scopes required to prove attenuation from parent ${parentCredential.credentialSubject.delegation.id}`,
69
+ };
70
+ }
71
+ const parentScopeSet = new Set(parentScopes);
72
+ const widenedScopes = childScopes.filter((scope) => !parentScopeSet.has(scope));
73
+ if (widenedScopes.length > 0) {
74
+ return {
75
+ valid: false,
76
+ reason: `Delegation ${childDelegation.id} widens scopes beyond parent ${parentCredential.credentialSubject.delegation.id}: ${widenedScopes.join(", ")}`,
77
+ };
78
+ }
79
+ return { valid: true };
80
+ }
81
+ /**
82
+ * Create MCP-I middleware for a standard MCP SDK Server.
83
+ *
84
+ * For most use cases, prefer {@link withMCPI} from `./with-mcpi-server.ts`
85
+ * which wraps this function and (by default) auto-registers handshake +
86
+ * auto-attaches proofs.
87
+ *
88
+ * Use `createMCPIMiddleware` directly when:
89
+ * - You use the low-level `Server` API (not `McpServer`)
90
+ * - You need custom request handler patterns
91
+ * - You want per-tool control over proof/delegation wrapping
92
+ *
93
+ * @param config - Agent identity and session configuration
94
+ * @param cryptoProvider - Platform-specific crypto implementation
95
+ * @returns Middleware components for session management and proof generation
96
+ *
97
+ * @remarks
98
+ * **Single-process only**: This middleware stores session state in memory using closure
99
+ * variables (`activeSessionId`, `sessionNonces`). It is NOT suitable for multi-instance
100
+ * deployments behind a load balancer. For distributed deployments, implement a custom
101
+ * `SessionStore` backed by Redis, DynamoDB, or similar and pass it via `config.session`.
102
+ */
103
+ export function createMCPIMiddleware(config, cryptoProvider) {
104
+ const identity = {
105
+ did: config.identity.did,
106
+ kid: config.identity.kid,
107
+ privateKey: config.identity.privateKey,
108
+ publicKey: config.identity.publicKey,
109
+ };
110
+ const sessionManager = new SessionManager(cryptoProvider, {
111
+ ...config.session,
112
+ serverDid: identity.did,
113
+ });
114
+ const proofGenerator = new ProofGenerator(identity, cryptoProvider);
115
+ const delegationConfig = config.delegation;
116
+ // Session map: sessionId → last nonce (for proof generation)
117
+ const sessionNonces = new Map();
118
+ // Active session tracking — set after handshake (manual or auto)
119
+ let activeSessionId;
120
+ const handshakeTool = {
121
+ name: "_mcpi_handshake",
122
+ description: "MCP-I identity handshake — establishes a cryptographic session",
123
+ inputSchema: {
124
+ type: "object",
125
+ properties: {
126
+ nonce: { type: "string", description: "Client-generated unique nonce" },
127
+ audience: {
128
+ type: "string",
129
+ description: "Intended audience (server DID or URL)",
130
+ },
131
+ timestamp: { type: "number", description: "Unix epoch seconds" },
132
+ agentDid: {
133
+ type: "string",
134
+ description: "Client agent DID (optional)",
135
+ },
136
+ },
137
+ required: ["nonce", "audience", "timestamp"],
138
+ },
139
+ };
140
+ const mcpiTool = {
141
+ name: "_mcpi",
142
+ description: "MCP-I protocol — identity verification, session handshake, and server metadata",
143
+ inputSchema: {
144
+ type: "object",
145
+ properties: {
146
+ action: {
147
+ type: "string",
148
+ enum: [...MCPI_ACTIONS],
149
+ description: "Protocol operation to perform",
150
+ },
151
+ nonce: { type: "string", description: "Client-generated unique nonce" },
152
+ audience: {
153
+ type: "string",
154
+ description: "Intended audience (server DID or URL)",
155
+ },
156
+ timestamp: { type: "number", description: "Unix epoch seconds" },
157
+ agentDid: {
158
+ type: "string",
159
+ description: "Client agent DID (optional)",
160
+ },
161
+ },
162
+ required: ["action"],
163
+ },
164
+ };
165
+ async function handleHandshake(args) {
166
+ if (!validateHandshakeFormat(args)) {
167
+ return {
168
+ content: [
169
+ {
170
+ type: "text",
171
+ text: JSON.stringify({
172
+ success: false,
173
+ error: {
174
+ code: MCPI_ERROR_CODES.handshake_failed,
175
+ message: "Invalid handshake format: requires nonce (string), audience (string), and timestamp (positive integer)",
176
+ },
177
+ }),
178
+ },
179
+ ],
180
+ isError: true,
181
+ };
182
+ }
183
+ const result = await sessionManager.validateHandshake(args);
184
+ if (result.success && result.session) {
185
+ sessionNonces.set(result.session.sessionId, result.session.nonce);
186
+ activeSessionId = result.session.sessionId;
187
+ }
188
+ return {
189
+ content: [
190
+ {
191
+ type: "text",
192
+ text: JSON.stringify({
193
+ success: result.success,
194
+ ...(result.session && {
195
+ sessionId: result.session.sessionId,
196
+ serverDid: identity.did,
197
+ serverKid: identity.kid,
198
+ }),
199
+ ...(result.error && { error: result.error }),
200
+ }),
201
+ },
202
+ ],
203
+ ...(result.error && { isError: true }),
204
+ };
205
+ }
206
+ async function handleIdentity() {
207
+ return {
208
+ content: [
209
+ {
210
+ type: "text",
211
+ text: JSON.stringify({
212
+ did: identity.did,
213
+ kid: identity.kid,
214
+ name: config.identity.agentName ?? identity.did,
215
+ capabilities: ["handshake", "signing", "verification"],
216
+ protocolVersion: "1.0.0",
217
+ }),
218
+ },
219
+ ],
220
+ };
221
+ }
222
+ async function handleMCPI(args) {
223
+ const action = typeof args.action === "string"
224
+ ? args.action
225
+ : undefined;
226
+ switch (action) {
227
+ case "handshake":
228
+ return handleHandshake(args);
229
+ case "identity":
230
+ return handleIdentity();
231
+ case "reputation":
232
+ return {
233
+ content: [
234
+ {
235
+ type: "text",
236
+ text: JSON.stringify({
237
+ success: false,
238
+ error: {
239
+ code: MCPI_ERROR_CODES.runtime_error,
240
+ message: 'action: "reputation" is not yet implemented.',
241
+ },
242
+ }),
243
+ },
244
+ ],
245
+ isError: true,
246
+ };
247
+ default:
248
+ return {
249
+ content: [
250
+ {
251
+ type: "text",
252
+ text: JSON.stringify({
253
+ success: false,
254
+ error: {
255
+ code: MCPI_ERROR_CODES.invalid_request,
256
+ message: `Unknown _mcpi action: "${action ?? "(missing)"}". Valid actions: ${MCPI_ACTIONS.join(", ")}`,
257
+ },
258
+ }),
259
+ },
260
+ ],
261
+ isError: true,
262
+ };
263
+ }
264
+ }
265
+ /**
266
+ * Auto-create a session for proof generation when no handshake has occurred.
267
+ * In production, MCP-I-aware runtimes should execute handshake before tool calls.
268
+ * This convenience mode allows non-MCP-I clients (like MCP Inspector) to
269
+ * still see proofs without manual handshake.
270
+ */
271
+ async function ensureSession() {
272
+ if (activeSessionId) {
273
+ const existing = await sessionManager.getSession(activeSessionId);
274
+ if (existing)
275
+ return activeSessionId;
276
+ }
277
+ if (!config.autoSession)
278
+ return undefined;
279
+ // Generate a server-side session with cryptographically random nonce (SPEC.md §4)
280
+ const nonceBytes = await cryptoProvider.randomBytes(16);
281
+ const nonce = base64urlEncodeFromBytes(nonceBytes);
282
+ const timestamp = Math.floor(Date.now() / 1000);
283
+ const result = await sessionManager.validateHandshake({
284
+ nonce,
285
+ audience: identity.did,
286
+ timestamp,
287
+ });
288
+ if (result.success && result.session) {
289
+ activeSessionId = result.session.sessionId;
290
+ sessionNonces.set(result.session.sessionId, result.session.nonce);
291
+ return activeSessionId;
292
+ }
293
+ return undefined;
294
+ }
295
+ function wrapWithProof(toolName, handler) {
296
+ return async (args, sessionId) => {
297
+ const result = await handler(args, sessionId);
298
+ if (result.isError) {
299
+ return result;
300
+ }
301
+ // Resolve session: explicit param → active session → auto-create
302
+ const resolvedSessionId = sessionId ?? await ensureSession();
303
+ if (!resolvedSessionId) {
304
+ return result;
305
+ }
306
+ const session = await sessionManager.getSession(resolvedSessionId);
307
+ if (!session) {
308
+ return result;
309
+ }
310
+ try {
311
+ const request = { method: toolName, params: args };
312
+ const response = { data: result.content };
313
+ const proof = await proofGenerator.generateProof(request, response, session);
314
+ // Attach proof as _meta (rendered by MCP Inspector, invisible to LLMs)
315
+ result._meta = { proof };
316
+ }
317
+ catch (error) {
318
+ logger.error("[mcpi] Proof generation failed", {
319
+ tool: toolName,
320
+ error: error instanceof Error ? error.message : String(error),
321
+ });
322
+ result._meta = {
323
+ proofError: "Proof generation failed — response is unproven",
324
+ };
325
+ }
326
+ return result;
327
+ };
328
+ }
329
+ function wrapWithDelegation(toolName, config, handler) {
330
+ const legacyUnsafeDelegationEnabled = delegationConfig?.allowLegacyUnsafeDelegation === true;
331
+ const didKeyResolver = createDidKeyResolver();
332
+ const fetchProvider = delegationConfig?.fetchProvider ??
333
+ (typeof globalThis.fetch === "function"
334
+ ? new RuntimeFetchProvider()
335
+ : undefined);
336
+ const didWebResolver = fetchProvider
337
+ ? createDidWebResolver(fetchProvider)
338
+ : undefined;
339
+ const didResolver = {
340
+ async resolve(did) {
341
+ const customResolver = delegationConfig?.didResolver;
342
+ if (customResolver) {
343
+ const resolved = await customResolver.resolve(did);
344
+ if (resolved) {
345
+ return resolved;
346
+ }
347
+ }
348
+ if (did.startsWith("did:key:")) {
349
+ return didKeyResolver.resolve(did);
350
+ }
351
+ if (did.startsWith("did:web:")) {
352
+ return didWebResolver?.resolve(did) ?? null;
353
+ }
354
+ return null;
355
+ },
356
+ };
357
+ const signatureVerifier = async (vc, publicKeyJwk) => {
358
+ const proof = vc.proof;
359
+ if (!proof) {
360
+ return { valid: false, reason: "Missing proof" };
361
+ }
362
+ const proofValue = proof["proofValue"];
363
+ if (!proofValue) {
364
+ return { valid: false, reason: "Missing proofValue in proof" };
365
+ }
366
+ // Reconstruct the unsigned VC (without proof) for signature verification
367
+ const vcRecord = vc;
368
+ const vcWithoutProof = {};
369
+ for (const [k, v] of Object.entries(vcRecord)) {
370
+ if (k !== "proof")
371
+ vcWithoutProof[k] = v;
372
+ }
373
+ const canonical = canonicalizeJSON(vcWithoutProof);
374
+ const data = new TextEncoder().encode(canonical);
375
+ // Decode signature from base64url proof value
376
+ const sigBytes = base64urlDecodeToBytes(proofValue);
377
+ // Get public key from JWK (x is base64url-encoded raw key bytes)
378
+ const jwk = publicKeyJwk;
379
+ if (!jwk.x) {
380
+ return { valid: false, reason: "No x field in publicKeyJwk" };
381
+ }
382
+ // Convert base64url key to standard base64 for the crypto provider
383
+ const pubKeyBytes = base64urlDecodeToBytes(jwk.x);
384
+ const pubKeyBase64 = bytesToBase64(pubKeyBytes);
385
+ const valid = await cryptoProvider.verify(data, sigBytes, pubKeyBase64);
386
+ return {
387
+ valid,
388
+ reason: valid ? undefined : "Signature verification failed",
389
+ };
390
+ };
391
+ const verifier = new DelegationCredentialVerifier({
392
+ didResolver,
393
+ signatureVerifier,
394
+ statusListResolver: delegationConfig?.statusListResolver,
395
+ });
396
+ const buildDelegationErrorResponse = (error, reason) => ({
397
+ content: [
398
+ {
399
+ type: "text",
400
+ text: JSON.stringify({ error, reason }),
401
+ },
402
+ ],
403
+ isError: true,
404
+ });
405
+ const validateDelegationChain = async (leafCredential, options) => {
406
+ const leafDelegation = extractDelegationFromVC(leafCredential);
407
+ let chain = [leafCredential];
408
+ if (leafDelegation.parentId) {
409
+ if (!delegationConfig?.resolveDelegationChain) {
410
+ if (legacyUnsafeDelegationEnabled) {
411
+ logger.warn(`[mcpi] Legacy delegation mode enabled: accepting parent-linked credential ${leafDelegation.id} without resolveDelegationChain`);
412
+ return { valid: true };
413
+ }
414
+ return {
415
+ valid: false,
416
+ reason: `Delegation ${leafDelegation.id} references parent ${leafDelegation.parentId} but no resolveDelegationChain handler is configured`,
417
+ };
418
+ }
419
+ let resolvedChain;
420
+ try {
421
+ resolvedChain =
422
+ await delegationConfig.resolveDelegationChain(leafCredential);
423
+ }
424
+ catch (error) {
425
+ return {
426
+ valid: false,
427
+ reason: `Failed to resolve delegation chain: ${error instanceof Error ? error.message : "Unknown error"}`,
428
+ };
429
+ }
430
+ if (resolvedChain.length === 0) {
431
+ return {
432
+ valid: false,
433
+ reason: `Delegation ${leafDelegation.id} references parent ${leafDelegation.parentId} but the resolved chain is empty`,
434
+ };
435
+ }
436
+ const leafIndex = resolvedChain.findIndex((credential) => credential.credentialSubject.delegation.id === leafDelegation.id);
437
+ if (leafIndex !== -1 && leafIndex !== resolvedChain.length - 1) {
438
+ return {
439
+ valid: false,
440
+ reason: `Resolved delegation chain for ${leafDelegation.id} must end with the leaf credential`,
441
+ };
442
+ }
443
+ chain =
444
+ leafIndex === -1 ? [...resolvedChain, leafCredential] : resolvedChain;
445
+ }
446
+ const seenIds = new Set();
447
+ let previousDelegation;
448
+ let previousCredential;
449
+ for (const credential of chain) {
450
+ const delegation = extractDelegationFromVC(credential);
451
+ if (seenIds.has(delegation.id)) {
452
+ return {
453
+ valid: false,
454
+ reason: `Delegation chain contains a circular reference at ${delegation.id}`,
455
+ };
456
+ }
457
+ seenIds.add(delegation.id);
458
+ if (credential.credentialStatus && !delegationConfig?.statusListResolver) {
459
+ if (legacyUnsafeDelegationEnabled) {
460
+ logger.warn(`[mcpi] Legacy delegation mode enabled: skipping status-list verification for ${delegation.id}`);
461
+ }
462
+ else {
463
+ return {
464
+ valid: false,
465
+ reason: `Delegation ${delegation.id} has credentialStatus but no statusListResolver is configured`,
466
+ };
467
+ }
468
+ }
469
+ const skipStatusForLegacy = legacyUnsafeDelegationEnabled &&
470
+ !!credential.credentialStatus &&
471
+ !delegationConfig?.statusListResolver;
472
+ const credentialVerification = await verifier.verifyDelegationCredential(credential, {
473
+ ...(skipStatusForLegacy ? { skipStatus: true } : {}),
474
+ ...(options?.skipSignature ? { skipSignature: true } : {}),
475
+ });
476
+ if (!credentialVerification.valid) {
477
+ return {
478
+ valid: false,
479
+ reason: `Delegation ${delegation.id} invalid: ${credentialVerification.reason}`,
480
+ };
481
+ }
482
+ if (!verifyDelegationAudience(delegation, identity.did)) {
483
+ return {
484
+ valid: false,
485
+ reason: `Delegation ${delegation.id} audience does not include server DID ${identity.did}`,
486
+ };
487
+ }
488
+ // When requireAudienceOnRedelegation is enabled, every non-root
489
+ // credential in the chain MUST have an audience constraint.
490
+ // This prevents confused-deputy attacks where re-delegated
491
+ // credentials are forwarded to unintended servers.
492
+ if (delegationConfig?.requireAudienceOnRedelegation &&
493
+ delegation.parentId &&
494
+ !delegation.constraints.audience) {
495
+ return {
496
+ valid: false,
497
+ reason: `Delegation ${delegation.id} is a re-delegation (parentId: ${delegation.parentId}) but has no audience constraint. Re-delegations must include an audience when requireAudienceOnRedelegation is enabled`,
498
+ };
499
+ }
500
+ if (!previousDelegation || !previousCredential) {
501
+ if (delegation.parentId) {
502
+ return {
503
+ valid: false,
504
+ reason: `Resolved delegation chain is incomplete: root delegation ${delegation.id} still references parent ${delegation.parentId}`,
505
+ };
506
+ }
507
+ previousDelegation = delegation;
508
+ previousCredential = credential;
509
+ continue;
510
+ }
511
+ if (delegation.parentId !== previousDelegation.id) {
512
+ return {
513
+ valid: false,
514
+ reason: `Delegation ${delegation.id} references parent ${delegation.parentId} but expected ${previousDelegation.id}`,
515
+ };
516
+ }
517
+ if (delegation.issuerDid !== previousDelegation.subjectDid) {
518
+ return {
519
+ valid: false,
520
+ reason: `Delegation ${delegation.id} issued by ${delegation.issuerDid} but parent subject is ${previousDelegation.subjectDid}`,
521
+ };
522
+ }
523
+ const scopeValidation = validateScopeAttenuation(previousCredential, credential);
524
+ if (!scopeValidation.valid) {
525
+ return scopeValidation;
526
+ }
527
+ previousDelegation = delegation;
528
+ previousCredential = credential;
529
+ }
530
+ const finalDelegation = extractDelegationFromVC(chain[chain.length - 1]);
531
+ if (finalDelegation.id !== leafDelegation.id) {
532
+ return {
533
+ valid: false,
534
+ reason: `Resolved delegation chain ended at ${finalDelegation.id} instead of leaf ${leafDelegation.id}`,
535
+ };
536
+ }
537
+ return { valid: true };
538
+ };
539
+ return async (args, sessionId) => {
540
+ const delegationArg = args["_mcpi_delegation"];
541
+ if (delegationArg === undefined || delegationArg === null) {
542
+ // No delegation provided — return needs_authorization response
543
+ const tokenBytes = await cryptoProvider.randomBytes(16);
544
+ const hex = Array.from(tokenBytes)
545
+ .map((b) => b.toString(16).padStart(2, "0"))
546
+ .join("");
547
+ const resumeToken = [
548
+ hex.slice(0, 8),
549
+ hex.slice(8, 12),
550
+ hex.slice(12, 16),
551
+ hex.slice(16, 20),
552
+ hex.slice(20),
553
+ ].join("-");
554
+ const expiresAt = Math.floor(Date.now() / 1000) + 300;
555
+ const authError = createNeedsAuthorizationError({
556
+ message: `Tool "${toolName}" requires delegation with scope: ${config.scopeId}`,
557
+ authorizationUrl: config.consentUrl,
558
+ resumeToken,
559
+ expiresAt,
560
+ scopes: [config.scopeId],
561
+ });
562
+ return {
563
+ content: [{ type: "text", text: JSON.stringify(authError) }],
564
+ };
565
+ }
566
+ // Accept delegation as either a JSON object (embedded proof) or a
567
+ // VC-JWT string (compact JWT). The Cloudflare consent service issues
568
+ // VC-JWTs; examples use embedded proofs. Support both transparently.
569
+ let vc;
570
+ let isVCJWT = false;
571
+ if (typeof delegationArg === "string") {
572
+ const parsed = parseVCJWT(delegationArg);
573
+ if (!parsed || !parsed.payload.vc) {
574
+ return buildDelegationErrorResponse(MCPI_ERROR_CODES.delegation_invalid, "Invalid VC-JWT format");
575
+ }
576
+ vc = parsed.payload.vc;
577
+ // VC-JWTs don't have an embedded proof — the JWT signature is the
578
+ // proof. Add a marker so basic validation (which checks for proof
579
+ // presence) passes. The actual signature is in the JWT envelope.
580
+ if (!vc.proof) {
581
+ vc = { ...vc, proof: { type: 'JwtProof2020', jwt: delegationArg } };
582
+ }
583
+ isVCJWT = true;
584
+ }
585
+ else {
586
+ vc = delegationArg;
587
+ }
588
+ // For VC-JWTs, skip the embedded proof/signature check — the JWT
589
+ // envelope signature is the proof. Basic checks (schema, expiry,
590
+ // status, scopes) still apply.
591
+ const verificationResult = await validateDelegationChain(vc, {
592
+ skipSignature: isVCJWT,
593
+ });
594
+ if (!verificationResult.valid) {
595
+ logger.warn(`[mcpi] Delegation verification failed for "${toolName}": ${verificationResult.reason}`);
596
+ return buildDelegationErrorResponse(MCPI_ERROR_CODES.delegation_invalid, verificationResult.reason ?? "Unknown delegation validation error");
597
+ }
598
+ const scopes = getDelegationScopes(vc);
599
+ if (!scopes.includes(config.scopeId)) {
600
+ logger.warn(`[mcpi] Delegation missing required scope "${config.scopeId}" for "${toolName}"`);
601
+ return buildDelegationErrorResponse(MCPI_ERROR_CODES.insufficient_scope, `Required scope "${config.scopeId}" not in delegation scopes`);
602
+ }
603
+ // Strip _mcpi_delegation from args before passing to handler
604
+ const cleanArgs = {};
605
+ for (const [k, v] of Object.entries(args)) {
606
+ if (k !== "_mcpi_delegation")
607
+ cleanArgs[k] = v;
608
+ }
609
+ logger.debug(`[mcpi] Delegation verified for "${toolName}", scope "${config.scopeId}"`);
610
+ return handler(cleanArgs, sessionId);
611
+ };
612
+ }
613
+ return {
614
+ identity: config.identity,
615
+ sessionManager,
616
+ proofGenerator,
617
+ mcpiTool,
618
+ handshakeTool,
619
+ handleMCPI,
620
+ handleHandshake,
621
+ wrapWithProof,
622
+ wrapWithDelegation,
623
+ };
624
+ }
625
+ //# sourceMappingURL=with-mcpi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-mcpi.js","sourceRoot":"","sources":["../../src/middleware/with-mcpi.ts"],"names":[],"mappings":"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"}