@kya-os/mcp-i-core 1.3.13 → 1.3.15

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 (255) hide show
  1. package/dist/config/remote-config.js +9 -12
  2. package/dist/runtime/base.d.ts +2 -1
  3. package/dist/runtime/base.js +34 -6
  4. package/dist/services/access-control.service.js +5 -0
  5. package/dist/services/tool-protection.service.js +17 -8
  6. package/package.json +2 -2
  7. package/.turbo/turbo-build.log +0 -4
  8. package/.turbo/turbo-test$colon$coverage.log +0 -4586
  9. package/.turbo/turbo-test.log +0 -4631
  10. package/COMPLIANCE_IMPROVEMENT_REPORT.md +0 -483
  11. package/Composer 3.md +0 -615
  12. package/GPT-5.md +0 -1169
  13. package/OPUS-plan.md +0 -352
  14. package/PHASE_3_AND_4.1_SUMMARY.md +0 -585
  15. package/PHASE_3_SUMMARY.md +0 -317
  16. package/PHASE_4.1.3_SUMMARY.md +0 -428
  17. package/PHASE_4.1_COMPLETE.md +0 -525
  18. package/PHASE_4_USER_DID_IDENTITY_LINKING_PLAN.md +0 -1240
  19. package/SCHEMA_COMPLIANCE_REPORT.md +0 -275
  20. package/TEST_PLAN.md +0 -571
  21. package/coverage/coverage-final.json +0 -60
  22. package/dist/cache/oauth-config-cache.d.ts.map +0 -1
  23. package/dist/cache/oauth-config-cache.js.map +0 -1
  24. package/dist/cache/tool-protection-cache.d.ts.map +0 -1
  25. package/dist/cache/tool-protection-cache.js.map +0 -1
  26. package/dist/compliance/index.d.ts.map +0 -1
  27. package/dist/compliance/index.js.map +0 -1
  28. package/dist/compliance/schema-registry.d.ts.map +0 -1
  29. package/dist/compliance/schema-registry.js.map +0 -1
  30. package/dist/compliance/schema-verifier.d.ts.map +0 -1
  31. package/dist/compliance/schema-verifier.js.map +0 -1
  32. package/dist/config/remote-config.d.ts.map +0 -1
  33. package/dist/config/remote-config.js.map +0 -1
  34. package/dist/config.d.ts.map +0 -1
  35. package/dist/config.js.map +0 -1
  36. package/dist/delegation/audience-validator.d.ts.map +0 -1
  37. package/dist/delegation/audience-validator.js.map +0 -1
  38. package/dist/delegation/bitstring.d.ts.map +0 -1
  39. package/dist/delegation/bitstring.js.map +0 -1
  40. package/dist/delegation/cascading-revocation.d.ts.map +0 -1
  41. package/dist/delegation/cascading-revocation.js.map +0 -1
  42. package/dist/delegation/delegation-graph.d.ts.map +0 -1
  43. package/dist/delegation/delegation-graph.js.map +0 -1
  44. package/dist/delegation/did-key-resolver.d.ts.map +0 -1
  45. package/dist/delegation/did-key-resolver.js.map +0 -1
  46. package/dist/delegation/index.d.ts.map +0 -1
  47. package/dist/delegation/index.js.map +0 -1
  48. package/dist/delegation/statuslist-manager.d.ts.map +0 -1
  49. package/dist/delegation/statuslist-manager.js.map +0 -1
  50. package/dist/delegation/storage/index.d.ts.map +0 -1
  51. package/dist/delegation/storage/index.js.map +0 -1
  52. package/dist/delegation/storage/memory-graph-storage.d.ts.map +0 -1
  53. package/dist/delegation/storage/memory-graph-storage.js.map +0 -1
  54. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +0 -1
  55. package/dist/delegation/storage/memory-statuslist-storage.js.map +0 -1
  56. package/dist/delegation/utils.d.ts.map +0 -1
  57. package/dist/delegation/utils.js.map +0 -1
  58. package/dist/delegation/vc-issuer.d.ts.map +0 -1
  59. package/dist/delegation/vc-issuer.js.map +0 -1
  60. package/dist/delegation/vc-verifier.d.ts.map +0 -1
  61. package/dist/delegation/vc-verifier.js.map +0 -1
  62. package/dist/identity/idp-token-resolver.d.ts.map +0 -1
  63. package/dist/identity/idp-token-resolver.js.map +0 -1
  64. package/dist/identity/idp-token-storage.interface.d.ts.map +0 -1
  65. package/dist/identity/idp-token-storage.interface.js.map +0 -1
  66. package/dist/identity/user-did-manager.d.ts.map +0 -1
  67. package/dist/identity/user-did-manager.js.map +0 -1
  68. package/dist/index.d.ts.map +0 -1
  69. package/dist/index.js.map +0 -1
  70. package/dist/providers/base.d.ts.map +0 -1
  71. package/dist/providers/base.js.map +0 -1
  72. package/dist/providers/memory.d.ts.map +0 -1
  73. package/dist/providers/memory.js.map +0 -1
  74. package/dist/runtime/audit-logger.d.ts.map +0 -1
  75. package/dist/runtime/audit-logger.js.map +0 -1
  76. package/dist/runtime/base.d.ts.map +0 -1
  77. package/dist/runtime/base.js.map +0 -1
  78. package/dist/services/access-control.service.d.ts.map +0 -1
  79. package/dist/services/access-control.service.js.map +0 -1
  80. package/dist/services/authorization/authorization-registry.d.ts.map +0 -1
  81. package/dist/services/authorization/authorization-registry.js.map +0 -1
  82. package/dist/services/authorization/types.d.ts.map +0 -1
  83. package/dist/services/authorization/types.js.map +0 -1
  84. package/dist/services/batch-delegation.service.d.ts.map +0 -1
  85. package/dist/services/batch-delegation.service.js.map +0 -1
  86. package/dist/services/crypto.service.d.ts.map +0 -1
  87. package/dist/services/crypto.service.js.map +0 -1
  88. package/dist/services/errors.d.ts.map +0 -1
  89. package/dist/services/errors.js.map +0 -1
  90. package/dist/services/index.d.ts.map +0 -1
  91. package/dist/services/index.js.map +0 -1
  92. package/dist/services/oauth-config.service.d.ts.map +0 -1
  93. package/dist/services/oauth-config.service.js.map +0 -1
  94. package/dist/services/oauth-provider-registry.d.ts.map +0 -1
  95. package/dist/services/oauth-provider-registry.js.map +0 -1
  96. package/dist/services/oauth-service.d.ts.map +0 -1
  97. package/dist/services/oauth-service.js.map +0 -1
  98. package/dist/services/oauth-token-retrieval.service.d.ts.map +0 -1
  99. package/dist/services/oauth-token-retrieval.service.js.map +0 -1
  100. package/dist/services/proof-verifier.d.ts.map +0 -1
  101. package/dist/services/proof-verifier.js.map +0 -1
  102. package/dist/services/provider-resolver.d.ts.map +0 -1
  103. package/dist/services/provider-resolver.js.map +0 -1
  104. package/dist/services/provider-validator.d.ts.map +0 -1
  105. package/dist/services/provider-validator.js.map +0 -1
  106. package/dist/services/session-registration.service.d.ts.map +0 -1
  107. package/dist/services/session-registration.service.js.map +0 -1
  108. package/dist/services/storage.service.d.ts.map +0 -1
  109. package/dist/services/storage.service.js.map +0 -1
  110. package/dist/services/tool-context-builder.d.ts.map +0 -1
  111. package/dist/services/tool-context-builder.js.map +0 -1
  112. package/dist/services/tool-protection.service.d.ts.map +0 -1
  113. package/dist/services/tool-protection.service.js.map +0 -1
  114. package/dist/types/oauth-required-error.d.ts.map +0 -1
  115. package/dist/types/oauth-required-error.js.map +0 -1
  116. package/dist/types/tool-protection.d.ts.map +0 -1
  117. package/dist/types/tool-protection.js.map +0 -1
  118. package/dist/utils/base58.d.ts.map +0 -1
  119. package/dist/utils/base58.js.map +0 -1
  120. package/dist/utils/base64.d.ts.map +0 -1
  121. package/dist/utils/base64.js.map +0 -1
  122. package/dist/utils/cors.d.ts.map +0 -1
  123. package/dist/utils/cors.js.map +0 -1
  124. package/dist/utils/did-helpers.d.ts.map +0 -1
  125. package/dist/utils/did-helpers.js.map +0 -1
  126. package/dist/utils/index.d.ts.map +0 -1
  127. package/dist/utils/index.js.map +0 -1
  128. package/dist/utils/storage-keys.d.ts.map +0 -1
  129. package/dist/utils/storage-keys.js.map +0 -1
  130. package/docs/API_REFERENCE.md +0 -1362
  131. package/docs/COMPLIANCE_MATRIX.md +0 -691
  132. package/docs/STATUSLIST2021_GUIDE.md +0 -696
  133. package/docs/W3C_VC_DELEGATION_GUIDE.md +0 -710
  134. package/src/__tests__/cache/tool-protection-cache.test.ts +0 -640
  135. package/src/__tests__/config/provider-runtime-config.test.ts +0 -309
  136. package/src/__tests__/delegation-e2e.test.ts +0 -690
  137. package/src/__tests__/identity/user-did-manager.test.ts +0 -232
  138. package/src/__tests__/index.test.ts +0 -56
  139. package/src/__tests__/integration/full-flow.test.ts +0 -789
  140. package/src/__tests__/integration.test.ts +0 -281
  141. package/src/__tests__/providers/base.test.ts +0 -173
  142. package/src/__tests__/providers/memory.test.ts +0 -319
  143. package/src/__tests__/regression/phase2-regression.test.ts +0 -429
  144. package/src/__tests__/runtime/audit-logger.test.ts +0 -154
  145. package/src/__tests__/runtime/base-extensions.test.ts +0 -595
  146. package/src/__tests__/runtime/base.test.ts +0 -869
  147. package/src/__tests__/runtime/delegation-flow.test.ts +0 -164
  148. package/src/__tests__/runtime/proof-client-did.test.ts +0 -376
  149. package/src/__tests__/runtime/route-interception.test.ts +0 -686
  150. package/src/__tests__/runtime/tool-protection-enforcement.test.ts +0 -908
  151. package/src/__tests__/services/agentshield-integration.test.ts +0 -791
  152. package/src/__tests__/services/cache-busting.test.ts +0 -125
  153. package/src/__tests__/services/oauth-service-pkce.test.ts +0 -556
  154. package/src/__tests__/services/provider-resolver-edge-cases.test.ts +0 -591
  155. package/src/__tests__/services/tool-protection-merged-config.test.ts +0 -485
  156. package/src/__tests__/services/tool-protection-oauth-provider.test.ts +0 -480
  157. package/src/__tests__/services/tool-protection.service.test.ts +0 -1373
  158. package/src/__tests__/utils/mock-providers.ts +0 -340
  159. package/src/cache/oauth-config-cache.d.ts +0 -69
  160. package/src/cache/oauth-config-cache.d.ts.map +0 -1
  161. package/src/cache/oauth-config-cache.js.map +0 -1
  162. package/src/cache/oauth-config-cache.ts +0 -123
  163. package/src/cache/tool-protection-cache.ts +0 -171
  164. package/src/compliance/EXAMPLE.md +0 -412
  165. package/src/compliance/__tests__/schema-verifier.test.ts +0 -797
  166. package/src/compliance/index.ts +0 -8
  167. package/src/compliance/schema-registry.ts +0 -460
  168. package/src/compliance/schema-verifier.ts +0 -708
  169. package/src/config/__tests__/merged-config.spec.ts +0 -445
  170. package/src/config/__tests__/remote-config.spec.ts +0 -268
  171. package/src/config/remote-config.ts +0 -264
  172. package/src/config.ts +0 -312
  173. package/src/delegation/__tests__/audience-validator.test.ts +0 -112
  174. package/src/delegation/__tests__/bitstring.test.ts +0 -346
  175. package/src/delegation/__tests__/cascading-revocation.test.ts +0 -628
  176. package/src/delegation/__tests__/delegation-graph.test.ts +0 -584
  177. package/src/delegation/__tests__/did-key-resolver.test.ts +0 -265
  178. package/src/delegation/__tests__/utils.test.ts +0 -152
  179. package/src/delegation/__tests__/vc-issuer.test.ts +0 -442
  180. package/src/delegation/__tests__/vc-verifier.test.ts +0 -922
  181. package/src/delegation/audience-validator.ts +0 -52
  182. package/src/delegation/bitstring.ts +0 -278
  183. package/src/delegation/cascading-revocation.ts +0 -370
  184. package/src/delegation/delegation-graph.ts +0 -299
  185. package/src/delegation/did-key-resolver.ts +0 -179
  186. package/src/delegation/index.ts +0 -14
  187. package/src/delegation/statuslist-manager.ts +0 -353
  188. package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +0 -366
  189. package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +0 -228
  190. package/src/delegation/storage/index.ts +0 -9
  191. package/src/delegation/storage/memory-graph-storage.ts +0 -178
  192. package/src/delegation/storage/memory-statuslist-storage.ts +0 -77
  193. package/src/delegation/utils.ts +0 -221
  194. package/src/delegation/vc-issuer.ts +0 -232
  195. package/src/delegation/vc-verifier.ts +0 -568
  196. package/src/identity/idp-token-resolver.ts +0 -181
  197. package/src/identity/idp-token-storage.interface.ts +0 -94
  198. package/src/identity/user-did-manager.ts +0 -526
  199. package/src/index.ts +0 -310
  200. package/src/providers/base.d.ts +0 -91
  201. package/src/providers/base.d.ts.map +0 -1
  202. package/src/providers/base.js.map +0 -1
  203. package/src/providers/base.ts +0 -96
  204. package/src/providers/memory.ts +0 -142
  205. package/src/runtime/audit-logger.ts +0 -39
  206. package/src/runtime/base.ts +0 -1392
  207. package/src/services/__tests__/access-control.integration.test.ts +0 -443
  208. package/src/services/__tests__/access-control.proof-response-validation.test.ts +0 -578
  209. package/src/services/__tests__/access-control.service.test.ts +0 -970
  210. package/src/services/__tests__/batch-delegation.service.test.ts +0 -351
  211. package/src/services/__tests__/crypto.service.test.ts +0 -531
  212. package/src/services/__tests__/oauth-provider-registry.test.ts +0 -142
  213. package/src/services/__tests__/proof-verifier.integration.test.ts +0 -485
  214. package/src/services/__tests__/proof-verifier.test.ts +0 -489
  215. package/src/services/__tests__/provider-resolution.integration.test.ts +0 -202
  216. package/src/services/__tests__/provider-resolver.test.ts +0 -213
  217. package/src/services/__tests__/storage.service.test.ts +0 -358
  218. package/src/services/access-control.service.ts +0 -990
  219. package/src/services/authorization/authorization-registry.ts +0 -66
  220. package/src/services/authorization/types.ts +0 -71
  221. package/src/services/batch-delegation.service.ts +0 -137
  222. package/src/services/crypto.service.ts +0 -302
  223. package/src/services/errors.ts +0 -76
  224. package/src/services/index.ts +0 -18
  225. package/src/services/oauth-config.service.d.ts +0 -53
  226. package/src/services/oauth-config.service.d.ts.map +0 -1
  227. package/src/services/oauth-config.service.js.map +0 -1
  228. package/src/services/oauth-config.service.ts +0 -192
  229. package/src/services/oauth-provider-registry.d.ts +0 -57
  230. package/src/services/oauth-provider-registry.d.ts.map +0 -1
  231. package/src/services/oauth-provider-registry.js.map +0 -1
  232. package/src/services/oauth-provider-registry.ts +0 -141
  233. package/src/services/oauth-service.ts +0 -544
  234. package/src/services/oauth-token-retrieval.service.ts +0 -245
  235. package/src/services/proof-verifier.ts +0 -478
  236. package/src/services/provider-resolver.d.ts +0 -48
  237. package/src/services/provider-resolver.d.ts.map +0 -1
  238. package/src/services/provider-resolver.js.map +0 -1
  239. package/src/services/provider-resolver.ts +0 -146
  240. package/src/services/provider-validator.ts +0 -170
  241. package/src/services/session-registration.service.ts +0 -251
  242. package/src/services/storage.service.ts +0 -566
  243. package/src/services/tool-context-builder.ts +0 -237
  244. package/src/services/tool-protection.service.ts +0 -1070
  245. package/src/types/oauth-required-error.ts +0 -63
  246. package/src/types/tool-protection.ts +0 -155
  247. package/src/utils/__tests__/did-helpers.test.ts +0 -156
  248. package/src/utils/base58.ts +0 -109
  249. package/src/utils/base64.ts +0 -148
  250. package/src/utils/cors.ts +0 -83
  251. package/src/utils/did-helpers.ts +0 -210
  252. package/src/utils/index.ts +0 -8
  253. package/src/utils/storage-keys.ts +0 -278
  254. package/tsconfig.json +0 -21
  255. package/vitest.config.ts +0 -56
@@ -54,20 +54,17 @@ async function fetchRemoteConfig(options, cache) {
54
54
  }
55
55
  // Fetch from API
56
56
  try {
57
- // Build API URL
58
- let url;
59
- if (projectId) {
60
- // Use project-scoped endpoint (preferred)
61
- url = `${apiUrl}${agentshield_api_1.AGENTSHIELD_ENDPOINTS.CONFIG(projectId)}`;
62
- }
63
- else if (agentDid) {
64
- // Use agent-scoped endpoint
65
- url = `${apiUrl}/api/v1/bouncer/config?agent_did=${encodeURIComponent(agentDid)}`;
66
- }
67
- else {
68
- console.warn('[RemoteConfig] Neither projectId nor agentDid provided');
57
+ // REMOVED: Legacy agent-scoped endpoint fallback
58
+ // Agent-only scoping causes cross-user delegation leakage (Priority 3 fallback issue)
59
+ // projectId is now REQUIRED for proper user isolation
60
+ if (!projectId) {
61
+ console.error('[RemoteConfig] projectId is required for user-scoped delegation. ' +
62
+ 'Agent-only scoping has been deprecated due to security concerns (cross-user delegation leakage). ' +
63
+ 'Please configure AGENTSHIELD_PROJECT_ID environment variable.');
69
64
  return null;
70
65
  }
66
+ // ✅ PROJECT-SCOPED ENDPOINT: Ensures delegations are properly scoped to user+agent
67
+ const url = `${apiUrl}${agentshield_api_1.AGENTSHIELD_ENDPOINTS.CONFIG(projectId)}`;
71
68
  const response = await fetchProvider(url, {
72
69
  headers: {
73
70
  'Authorization': `Bearer ${apiKey}`,
@@ -122,9 +122,10 @@ export declare class MCPIRuntimeBase {
122
122
  * @param session - Current session context
123
123
  * @param resumeToken - Token to resume after delegation
124
124
  * @param projectId - Project ID for AgentShield API
125
+ * @param provider - Provider name (e.g., "github", "credentials") to select specific auth method
125
126
  * @returns Full consent URL with snake_case parameters
126
127
  */
127
- protected buildConsentUrl(toolName: string, scopes: string[], session?: any, resumeToken?: string, projectId?: string): string;
128
+ protected buildConsentUrl(toolName: string, scopes: string[], session?: any, resumeToken?: string, projectId?: string, provider?: string): string;
128
129
  /**
129
130
  * Issue a new nonce and register it in the cache
130
131
  * Use this to get a nonce for the session context before calling processToolCall
@@ -271,7 +271,10 @@ class MCPIRuntimeBase {
271
271
  const resumeToken = this.generateResumeToken(interceptedCall);
272
272
  // Build consent URL with resume token
273
273
  // Note: projectId is not available in base class - subclasses should override buildConsentUrl
274
- const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken);
274
+ // Pass oauthProvider to ensure correct auth method is selected (e.g., "credentials" vs "github")
275
+ const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken, undefined, // projectId - handled by subclass override
276
+ protection.oauthProvider // Provider from tool config
277
+ );
275
278
  // Create error with intercepted call context and pre-generated resume token
276
279
  const error = new tool_protection_js_1.DelegationRequiredError(toolName, protection.requiredScopes, consentUrl, interceptedCall, resumeToken);
277
280
  // Store intercepted call for resumption
@@ -321,6 +324,17 @@ class MCPIRuntimeBase {
321
324
  agent_did: identity.did,
322
325
  scopes: protection.requiredScopes,
323
326
  };
327
+ // ✅ CRITICAL: Include user_did for user-scoped delegation verification
328
+ // This prevents cross-user delegation leakage (Priority 3 fallback issue)
329
+ // Without user_did, AgentShield cannot validate user isolation
330
+ if (session?.userDid) {
331
+ verifyRequest.user_did = session.userDid;
332
+ if (this.config.audit?.enabled) {
333
+ console.log("[MCP-I] 🔐 Including user_did in verification request", {
334
+ userDid: session.userDid.slice(0, 20) + "...",
335
+ });
336
+ }
337
+ }
324
338
  // Add delegation token if available (preferred over consent proof)
325
339
  if (delegationToken) {
326
340
  verifyRequest.delegation_token = delegationToken;
@@ -368,7 +382,9 @@ class MCPIRuntimeBase {
368
382
  expiresAt: this.clock.calculateExpiry(1800), // 30 minutes
369
383
  };
370
384
  const resumeToken = this.generateResumeToken(interceptedCall);
371
- const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken);
385
+ const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken, undefined, // projectId - handled by subclass override
386
+ protection.oauthProvider // Provider from tool config
387
+ );
372
388
  this.interceptedCalls.set(resumeToken, interceptedCall);
373
389
  this.cleanupExpiredInterceptedCalls();
374
390
  throw new tool_protection_js_1.DelegationRequiredError(toolName, protection.requiredScopes, consentUrl, interceptedCall, resumeToken);
@@ -402,7 +418,9 @@ class MCPIRuntimeBase {
402
418
  expiresAt: this.clock.calculateExpiry(1800), // 30 minutes
403
419
  };
404
420
  const resumeToken = this.generateResumeToken(interceptedCall);
405
- const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken);
421
+ const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken, undefined, // projectId - handled by subclass override
422
+ protection.oauthProvider // Provider from tool config
423
+ );
406
424
  this.interceptedCalls.set(resumeToken, interceptedCall);
407
425
  this.cleanupExpiredInterceptedCalls();
408
426
  throw new tool_protection_js_1.DelegationRequiredError(toolName, protection.requiredScopes, consentUrl, interceptedCall, resumeToken);
@@ -466,7 +484,9 @@ class MCPIRuntimeBase {
466
484
  expiresAt: this.clock.calculateExpiry(1800),
467
485
  };
468
486
  const resumeToken = this.generateResumeToken(interceptedCall);
469
- const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken);
487
+ const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken, undefined, // projectId - handled by subclass override
488
+ protection.oauthProvider // Provider from tool config
489
+ );
470
490
  this.interceptedCalls.set(resumeToken, interceptedCall);
471
491
  this.cleanupExpiredInterceptedCalls();
472
492
  throw new tool_protection_js_1.DelegationRequiredError(toolName, protection.requiredScopes, consentUrl, interceptedCall, resumeToken);
@@ -489,7 +509,9 @@ class MCPIRuntimeBase {
489
509
  expiresAt: this.clock.calculateExpiry(1800),
490
510
  };
491
511
  const resumeToken = this.generateResumeToken(interceptedCall);
492
- const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken);
512
+ const consentUrl = this.buildConsentUrl(toolName, protection.requiredScopes, session, resumeToken, undefined, // projectId - handled by subclass override
513
+ protection.oauthProvider // Provider from tool config
514
+ );
493
515
  this.interceptedCalls.set(resumeToken, interceptedCall);
494
516
  this.cleanupExpiredInterceptedCalls();
495
517
  throw new tool_protection_js_1.DelegationRequiredError(toolName, protection.requiredScopes, consentUrl, interceptedCall, resumeToken);
@@ -605,9 +627,10 @@ class MCPIRuntimeBase {
605
627
  * @param session - Current session context
606
628
  * @param resumeToken - Token to resume after delegation
607
629
  * @param projectId - Project ID for AgentShield API
630
+ * @param provider - Provider name (e.g., "github", "credentials") to select specific auth method
608
631
  * @returns Full consent URL with snake_case parameters
609
632
  */
610
- buildConsentUrl(toolName, scopes, session, resumeToken, projectId) {
633
+ buildConsentUrl(toolName, scopes, session, resumeToken, projectId, provider) {
611
634
  // Default implementation - override in subclasses
612
635
  // This URL should point to AgentShield's consent page
613
636
  // Parameter names use snake_case for AgentShield API compatibility
@@ -625,6 +648,11 @@ class MCPIRuntimeBase {
625
648
  if (resumeToken) {
626
649
  params.set("resume_token", resumeToken);
627
650
  }
651
+ // Add provider if specified (allows selecting specific auth method like "credentials" or "github")
652
+ // This is critical when multiple providers are configured for a project
653
+ if (provider) {
654
+ params.set("provider", provider);
655
+ }
628
656
  // Use AgentShield consent endpoint
629
657
  return `https://kya.vouched.id/bouncer/consent?${params.toString()}`;
630
658
  }
@@ -113,6 +113,11 @@ class AccessControlApiService {
113
113
  if (request.scopes !== undefined) {
114
114
  requestBody.scopes = request.scopes;
115
115
  }
116
+ // ✅ CRITICAL: Include user_did for user-scoped delegation verification
117
+ // This prevents cross-user delegation leakage (Priority 3 fallback issue)
118
+ if (request.user_did !== undefined) {
119
+ requestBody.user_did = request.user_did;
120
+ }
116
121
  // Handle credential_jwt: prefer request, fallback to context
117
122
  if (request.credential_jwt !== undefined) {
118
123
  requestBody.credential_jwt = request.credential_jwt;
@@ -409,6 +409,10 @@ class ToolProtectionService {
409
409
  if (errorMessage.includes("API key is missing or empty")) {
410
410
  throw error;
411
411
  }
412
+ // Re-throw projectId required errors (security fix - don't fallback)
413
+ if (errorMessage.includes("projectId is required")) {
414
+ throw error;
415
+ }
412
416
  // Re-throw HTTP errors (4xx, 5xx) - these indicate API issues, not network failures
413
417
  // Exception: 429 (rate limit) should fallback if fallback config is available
414
418
  if (errorMessage.includes("Failed to fetch bouncer config:")) {
@@ -541,15 +545,20 @@ class ToolProtectionService {
541
545
  // This endpoint returns config.toolProtection.tools with all tool rules
542
546
  let url;
543
547
  let useMergedEndpoint = false;
544
- if (this.config.projectId) {
545
- // MERGED CONFIG ENDPOINT: Returns config with embedded toolProtection.tools
546
- url = `${this.config.apiUrl}/api/v1/bouncer/projects/${encodeURIComponent(this.config.projectId)}/config`;
547
- useMergedEndpoint = true;
548
- }
549
- else {
550
- // ⚠️ LEGACY ENDPOINT: Agent-scoped, returns tools array (backward compatibility)
551
- url = `${this.config.apiUrl}/api/v1/bouncer/config?agent_did=${encodeURIComponent(agentDid)}`;
548
+ // REMOVED: Legacy agent-scoped endpoint fallback
549
+ // Agent-only scoping causes cross-user delegation leakage (Priority 3 fallback issue)
550
+ // projectId is now REQUIRED for proper user isolation
551
+ if (!this.config.projectId) {
552
+ const error = new Error("[ToolProtectionService] projectId is required for user-scoped delegation. " +
553
+ "Agent-only scoping has been deprecated due to security concerns (cross-user delegation leakage). " +
554
+ "Please configure AGENTSHIELD_PROJECT_ID environment variable.");
555
+ console.error("[ToolProtectionService]", error.message);
556
+ throw error;
552
557
  }
558
+ // ✅ PROJECT-SCOPED ENDPOINT: Returns config with embedded toolProtection.tools
559
+ // This endpoint ensures delegations are properly scoped to user+agent
560
+ url = `${this.config.apiUrl}/api/v1/bouncer/projects/${encodeURIComponent(this.config.projectId)}/config`;
561
+ useMergedEndpoint = true;
553
562
  // Add cache-busting query param when bypassing CDN cache
554
563
  // This is used during cache invalidation (clearAndRefresh) to ensure we get fresh data
555
564
  // from the origin server, not stale CDN-cached data
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kya-os/mcp-i-core",
3
- "version": "1.3.13",
3
+ "version": "1.3.15",
4
4
  "description": "Core runtime and types for MCP-I framework",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  "prepublishOnly": "npm run build && node ../create-mcpi-app/scripts/validate-no-workspace.js"
29
29
  },
30
30
  "dependencies": {
31
- "@kya-os/contracts": "^1.6.5",
31
+ "@kya-os/contracts": "^1.6.8",
32
32
  "jose": "^5.6.3",
33
33
  "json-canonicalize": "^2.0.0",
34
34
  "zod": "^3.25.76"
@@ -1,4 +0,0 @@
1
-
2
- > @kya-os/mcp-i-core@1.3.12 build /Users/dylanhobbs/Documents/@kya-os/xmcp-i/packages/mcp-i-core
3
- > tsc
4
-