@frontmcp/adapters 1.8.2 → 1.8.3

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/index.js CHANGED
@@ -224,7 +224,7 @@ async function createSecurityContextFromAuth(tool2, ctx, options) {
224
224
  return await options.securityResolver(tool2, ctx);
225
225
  }
226
226
  if (options.authProviderMapper) {
227
- const context = (0, import_mcp_from_openapi2.createSecurityContext)({});
227
+ const context = {};
228
228
  const securitySchemes = /* @__PURE__ */ new Set();
229
229
  for (const mapper of tool2.mapper) {
230
230
  if (mapper.security?.scheme) {
@@ -277,22 +277,38 @@ async function createSecurityContextFromAuth(tool2, ctx, options) {
277
277
  }
278
278
  }
279
279
  }
280
+ if (hasStaticAuth(options)) {
281
+ return (0, import_mcp_from_openapi2.createSecurityContext)({ ...options.staticAuth, ...context });
282
+ }
280
283
  const hasAnyAuth = context.jwt || context.apiKey || context.basic || context.oauth2Token;
281
- const authToken = ctx.authInfo?.token;
282
- if (!hasAnyAuth && authToken) {
283
- if (typeof authToken !== "string") {
284
- throw new Error(`authInfo.token must be a string, but got: ${typeof authToken}`);
284
+ if (!hasAnyAuth && options.passthroughCallerToken === true) {
285
+ const callerToken = getCallerToken(ctx);
286
+ if (callerToken) {
287
+ context.jwt = callerToken;
285
288
  }
286
- context.jwt = authToken;
287
289
  }
288
- return context;
290
+ return (0, import_mcp_from_openapi2.createSecurityContext)(context);
289
291
  }
290
- if (options.staticAuth) {
292
+ if (hasStaticAuth(options)) {
291
293
  return (0, import_mcp_from_openapi2.createSecurityContext)(options.staticAuth);
292
294
  }
293
- return (0, import_mcp_from_openapi2.createSecurityContext)({
294
- jwt: ctx.authInfo?.token
295
- });
295
+ if (options.passthroughCallerToken === true) {
296
+ return (0, import_mcp_from_openapi2.createSecurityContext)({ jwt: getCallerToken(ctx) });
297
+ }
298
+ return (0, import_mcp_from_openapi2.createSecurityContext)({});
299
+ }
300
+ function hasStaticAuth(options) {
301
+ return !!options.staticAuth && Object.keys(options.staticAuth).length > 0;
302
+ }
303
+ function getCallerToken(ctx) {
304
+ const authToken = ctx.authInfo?.token;
305
+ if (authToken === void 0 || authToken === null || authToken === "") {
306
+ return void 0;
307
+ }
308
+ if (typeof authToken !== "string") {
309
+ throw new Error(`authInfo.token must be a string, but got: ${typeof authToken}`);
310
+ }
311
+ return authToken;
296
312
  }
297
313
  function extractSecuritySchemes(tools) {
298
314
  const schemes = /* @__PURE__ */ new Set();
@@ -328,12 +344,12 @@ function validateSecurityConfiguration(tools, options) {
328
344
  );
329
345
  return result;
330
346
  }
331
- if (options.staticAuth && Object.keys(options.staticAuth).length > 0) {
347
+ if (hasStaticAuth(options)) {
332
348
  result.securityRiskScore = "medium";
333
349
  result.warnings.push(
334
350
  "SECURITY INFO: Using staticAuth with hardcoded credentials. Ensure credentials are stored securely (environment variables, secrets manager)."
335
351
  );
336
- return result;
352
+ return withPassthroughRisk(result, securitySchemes, options);
337
353
  }
338
354
  const schemesInInput = new Set(options.securitySchemesInInput || []);
339
355
  if (options.authProviderMapper || schemesInInput.size > 0) {
@@ -343,13 +359,18 @@ function validateSecurityConfiguration(tools, options) {
343
359
  `INFO: Per-scheme security control enabled. Schemes in input: ${Array.from(schemesInInput).join(", ")}`
344
360
  );
345
361
  }
362
+ const passthroughFallback = [];
346
363
  for (const scheme of securitySchemes) {
347
364
  if (schemesInInput.has(scheme)) {
348
365
  continue;
349
366
  }
350
367
  if (!options.authProviderMapper?.[scheme]) {
351
- result.valid = false;
352
- result.missingMappings.push(scheme);
368
+ if (options.passthroughCallerToken === true) {
369
+ passthroughFallback.push(scheme);
370
+ } else {
371
+ result.valid = false;
372
+ result.missingMappings.push(scheme);
373
+ }
353
374
  }
354
375
  }
355
376
  if (!result.valid) {
@@ -357,19 +378,36 @@ function validateSecurityConfiguration(tools, options) {
357
378
  `ERROR: Missing auth provider mappings for security schemes: ${result.missingMappings.join(", ")}`
358
379
  );
359
380
  }
381
+ withPassthroughRisk(result, securitySchemes, options);
382
+ if (passthroughFallback.length > 0) {
383
+ result.warnings.push(
384
+ `SECURITY WARNING: Security schemes with no authProviderMapper entry (${passthroughFallback.join(", ")}) get the MCP client's own token, because passthroughCallerToken is enabled.`
385
+ );
386
+ }
360
387
  return result;
361
388
  }
362
- if (securitySchemes.size > 0) {
389
+ if (securitySchemes.size > 0 && options.passthroughCallerToken !== true) {
390
+ const schemesStr = Array.from(securitySchemes).join(", ");
363
391
  result.securityRiskScore = "medium";
364
392
  result.warnings.push(
365
- `INFO: No auth configuration provided. Using default ctx.authInfo.token for all security schemes: ${Array.from(
366
- securitySchemes
367
- ).join(", ")}`
368
- );
369
- result.warnings.push(
370
- "RECOMMENDATION: For multiple auth providers, use authProviderMapper or securityResolver to map each security scheme to the correct auth provider."
393
+ `SECURITY WARNING: No auth configuration provided, so the adapter has no credentials for the API (security schemes: ${schemesStr}). Operations that require authentication will fail. The MCP client's own token is not forwarded: configure authProviderMapper, securityResolver or staticAuth, or set passthroughCallerToken: true if the API is meant to receive the caller's MCP token.`
371
394
  );
372
395
  }
396
+ return withPassthroughRisk(result, securitySchemes, options);
397
+ }
398
+ function canPassThroughCallerToken(options) {
399
+ return options.passthroughCallerToken === true && !options.securityResolver && !hasStaticAuth(options);
400
+ }
401
+ function withPassthroughRisk(result, securitySchemes, options) {
402
+ if (securitySchemes.size === 0 || !canPassThroughCallerToken(options)) {
403
+ return result;
404
+ }
405
+ const schemesStr = Array.from(securitySchemes).join(", ");
406
+ const when = options.authProviderMapper ? " whenever no authProviderMapper function returns a credential" : "";
407
+ result.securityRiskScore = "high";
408
+ result.warnings.push(
409
+ `SECURITY WARNING: passthroughCallerToken is enabled. The MCP client's own token (ctx.authInfo.token) is sent to the API${when} for security schemes: ${schemesStr}. Only use this when the API accepts tokens issued for this MCP server.`
410
+ );
373
411
  return result;
374
412
  }
375
413
  async function resolveToolSecurity(tool2, ctx, options) {
@@ -387,9 +425,10 @@ async function resolveToolSecurity(tool2, ctx, options) {
387
425
  Required security schemes: ${schemesStr}
388
426
  Solutions:
389
427
  1. Add authProviderMapper: { '${firstScheme}': (ctx) => ctx.authInfo.user?.token }
390
- 2. Add securityResolver: (tool, ctx) => ({ jwt: ctx.authInfo.token })
428
+ 2. Add securityResolver: async (tool, ctx) => ({ jwt: await getApiToken(ctx) })
391
429
  3. Add staticAuth: { jwt: process.env.API_TOKEN }
392
- 4. Set generateOptions.includeSecurityInInput: true (not recommended for production)`
430
+ 4. Set passthroughCallerToken: true, only if the API accepts the MCP client's own token
431
+ 5. Set generateOptions.includeSecurityInInput: true (not recommended for production)`
393
432
  );
394
433
  }
395
434
  return await securityResolver.resolve(tool2.mapper, securityContext);
@@ -1190,7 +1229,7 @@ Add one of the following to your adapter configuration:
1190
1229
  }
1191
1230
 
1192
1231
  2. securityResolver:
1193
- securityResolver: (tool, authInfo) => ({ jwt: authInfo.token })
1232
+ securityResolver: async (tool, ctx) => ({ jwt: await getApiToken(ctx) })
1194
1233
 
1195
1234
  3. staticAuth:
1196
1235
  staticAuth: { jwt: process.env.API_TOKEN }
package/openapi/index.js CHANGED
@@ -224,7 +224,7 @@ async function createSecurityContextFromAuth(tool2, ctx, options) {
224
224
  return await options.securityResolver(tool2, ctx);
225
225
  }
226
226
  if (options.authProviderMapper) {
227
- const context = (0, import_mcp_from_openapi2.createSecurityContext)({});
227
+ const context = {};
228
228
  const securitySchemes = /* @__PURE__ */ new Set();
229
229
  for (const mapper of tool2.mapper) {
230
230
  if (mapper.security?.scheme) {
@@ -277,22 +277,38 @@ async function createSecurityContextFromAuth(tool2, ctx, options) {
277
277
  }
278
278
  }
279
279
  }
280
+ if (hasStaticAuth(options)) {
281
+ return (0, import_mcp_from_openapi2.createSecurityContext)({ ...options.staticAuth, ...context });
282
+ }
280
283
  const hasAnyAuth = context.jwt || context.apiKey || context.basic || context.oauth2Token;
281
- const authToken = ctx.authInfo?.token;
282
- if (!hasAnyAuth && authToken) {
283
- if (typeof authToken !== "string") {
284
- throw new Error(`authInfo.token must be a string, but got: ${typeof authToken}`);
284
+ if (!hasAnyAuth && options.passthroughCallerToken === true) {
285
+ const callerToken = getCallerToken(ctx);
286
+ if (callerToken) {
287
+ context.jwt = callerToken;
285
288
  }
286
- context.jwt = authToken;
287
289
  }
288
- return context;
290
+ return (0, import_mcp_from_openapi2.createSecurityContext)(context);
289
291
  }
290
- if (options.staticAuth) {
292
+ if (hasStaticAuth(options)) {
291
293
  return (0, import_mcp_from_openapi2.createSecurityContext)(options.staticAuth);
292
294
  }
293
- return (0, import_mcp_from_openapi2.createSecurityContext)({
294
- jwt: ctx.authInfo?.token
295
- });
295
+ if (options.passthroughCallerToken === true) {
296
+ return (0, import_mcp_from_openapi2.createSecurityContext)({ jwt: getCallerToken(ctx) });
297
+ }
298
+ return (0, import_mcp_from_openapi2.createSecurityContext)({});
299
+ }
300
+ function hasStaticAuth(options) {
301
+ return !!options.staticAuth && Object.keys(options.staticAuth).length > 0;
302
+ }
303
+ function getCallerToken(ctx) {
304
+ const authToken = ctx.authInfo?.token;
305
+ if (authToken === void 0 || authToken === null || authToken === "") {
306
+ return void 0;
307
+ }
308
+ if (typeof authToken !== "string") {
309
+ throw new Error(`authInfo.token must be a string, but got: ${typeof authToken}`);
310
+ }
311
+ return authToken;
296
312
  }
297
313
  function extractSecuritySchemes(tools) {
298
314
  const schemes = /* @__PURE__ */ new Set();
@@ -328,12 +344,12 @@ function validateSecurityConfiguration(tools, options) {
328
344
  );
329
345
  return result;
330
346
  }
331
- if (options.staticAuth && Object.keys(options.staticAuth).length > 0) {
347
+ if (hasStaticAuth(options)) {
332
348
  result.securityRiskScore = "medium";
333
349
  result.warnings.push(
334
350
  "SECURITY INFO: Using staticAuth with hardcoded credentials. Ensure credentials are stored securely (environment variables, secrets manager)."
335
351
  );
336
- return result;
352
+ return withPassthroughRisk(result, securitySchemes, options);
337
353
  }
338
354
  const schemesInInput = new Set(options.securitySchemesInInput || []);
339
355
  if (options.authProviderMapper || schemesInInput.size > 0) {
@@ -343,13 +359,18 @@ function validateSecurityConfiguration(tools, options) {
343
359
  `INFO: Per-scheme security control enabled. Schemes in input: ${Array.from(schemesInInput).join(", ")}`
344
360
  );
345
361
  }
362
+ const passthroughFallback = [];
346
363
  for (const scheme of securitySchemes) {
347
364
  if (schemesInInput.has(scheme)) {
348
365
  continue;
349
366
  }
350
367
  if (!options.authProviderMapper?.[scheme]) {
351
- result.valid = false;
352
- result.missingMappings.push(scheme);
368
+ if (options.passthroughCallerToken === true) {
369
+ passthroughFallback.push(scheme);
370
+ } else {
371
+ result.valid = false;
372
+ result.missingMappings.push(scheme);
373
+ }
353
374
  }
354
375
  }
355
376
  if (!result.valid) {
@@ -357,19 +378,36 @@ function validateSecurityConfiguration(tools, options) {
357
378
  `ERROR: Missing auth provider mappings for security schemes: ${result.missingMappings.join(", ")}`
358
379
  );
359
380
  }
381
+ withPassthroughRisk(result, securitySchemes, options);
382
+ if (passthroughFallback.length > 0) {
383
+ result.warnings.push(
384
+ `SECURITY WARNING: Security schemes with no authProviderMapper entry (${passthroughFallback.join(", ")}) get the MCP client's own token, because passthroughCallerToken is enabled.`
385
+ );
386
+ }
360
387
  return result;
361
388
  }
362
- if (securitySchemes.size > 0) {
389
+ if (securitySchemes.size > 0 && options.passthroughCallerToken !== true) {
390
+ const schemesStr = Array.from(securitySchemes).join(", ");
363
391
  result.securityRiskScore = "medium";
364
392
  result.warnings.push(
365
- `INFO: No auth configuration provided. Using default ctx.authInfo.token for all security schemes: ${Array.from(
366
- securitySchemes
367
- ).join(", ")}`
368
- );
369
- result.warnings.push(
370
- "RECOMMENDATION: For multiple auth providers, use authProviderMapper or securityResolver to map each security scheme to the correct auth provider."
393
+ `SECURITY WARNING: No auth configuration provided, so the adapter has no credentials for the API (security schemes: ${schemesStr}). Operations that require authentication will fail. The MCP client's own token is not forwarded: configure authProviderMapper, securityResolver or staticAuth, or set passthroughCallerToken: true if the API is meant to receive the caller's MCP token.`
371
394
  );
372
395
  }
396
+ return withPassthroughRisk(result, securitySchemes, options);
397
+ }
398
+ function canPassThroughCallerToken(options) {
399
+ return options.passthroughCallerToken === true && !options.securityResolver && !hasStaticAuth(options);
400
+ }
401
+ function withPassthroughRisk(result, securitySchemes, options) {
402
+ if (securitySchemes.size === 0 || !canPassThroughCallerToken(options)) {
403
+ return result;
404
+ }
405
+ const schemesStr = Array.from(securitySchemes).join(", ");
406
+ const when = options.authProviderMapper ? " whenever no authProviderMapper function returns a credential" : "";
407
+ result.securityRiskScore = "high";
408
+ result.warnings.push(
409
+ `SECURITY WARNING: passthroughCallerToken is enabled. The MCP client's own token (ctx.authInfo.token) is sent to the API${when} for security schemes: ${schemesStr}. Only use this when the API accepts tokens issued for this MCP server.`
410
+ );
373
411
  return result;
374
412
  }
375
413
  async function resolveToolSecurity(tool2, ctx, options) {
@@ -387,9 +425,10 @@ async function resolveToolSecurity(tool2, ctx, options) {
387
425
  Required security schemes: ${schemesStr}
388
426
  Solutions:
389
427
  1. Add authProviderMapper: { '${firstScheme}': (ctx) => ctx.authInfo.user?.token }
390
- 2. Add securityResolver: (tool, ctx) => ({ jwt: ctx.authInfo.token })
428
+ 2. Add securityResolver: async (tool, ctx) => ({ jwt: await getApiToken(ctx) })
391
429
  3. Add staticAuth: { jwt: process.env.API_TOKEN }
392
- 4. Set generateOptions.includeSecurityInInput: true (not recommended for production)`
430
+ 4. Set passthroughCallerToken: true, only if the API accepts the MCP client's own token
431
+ 5. Set generateOptions.includeSecurityInInput: true (not recommended for production)`
393
432
  );
394
433
  }
395
434
  return await securityResolver.resolve(tool2.mapper, securityContext);
@@ -1190,7 +1229,7 @@ Add one of the following to your adapter configuration:
1190
1229
  }
1191
1230
 
1192
1231
  2. securityResolver:
1193
- securityResolver: (tool, authInfo) => ({ jwt: authInfo.token })
1232
+ securityResolver: async (tool, ctx) => ({ jwt: await getApiToken(ctx) })
1194
1233
 
1195
1234
  3. staticAuth:
1196
1235
  staticAuth: { jwt: process.env.API_TOKEN }
@@ -28,7 +28,7 @@ export interface SecurityValidationResult {
28
28
  * @param options - Adapter options with auth configuration
29
29
  * @returns Security context for resolver
30
30
  */
31
- export declare function createSecurityContextFromAuth(tool: McpOpenAPITool, ctx: FrontMcpContext, options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth'>): Promise<SecurityContext>;
31
+ export declare function createSecurityContextFromAuth(tool: McpOpenAPITool, ctx: FrontMcpContext, options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth' | 'passthroughCallerToken'>): Promise<SecurityContext>;
32
32
  /**
33
33
  * Extract all security schemes used by a set of tools
34
34
  *
@@ -43,7 +43,7 @@ export declare function extractSecuritySchemes(tools: McpOpenAPITool[]): Set<str
43
43
  * @param options - Adapter options
44
44
  * @returns Validation result with errors and warnings
45
45
  */
46
- export declare function validateSecurityConfiguration(tools: McpOpenAPITool[], options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth' | 'generateOptions' | 'securitySchemesInInput'>): SecurityValidationResult;
46
+ export declare function validateSecurityConfiguration(tools: McpOpenAPITool[], options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth' | 'generateOptions' | 'securitySchemesInInput' | 'passthroughCallerToken'>): SecurityValidationResult;
47
47
  /**
48
48
  * Resolve security for an OpenAPI tool with validation
49
49
  *
@@ -53,5 +53,5 @@ export declare function validateSecurityConfiguration(tools: McpOpenAPITool[], o
53
53
  * @returns Resolved security (headers, query params, etc.)
54
54
  * @throws Error if security cannot be resolved
55
55
  */
56
- export declare function resolveToolSecurity(tool: McpOpenAPITool, ctx: FrontMcpContext, options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth'>): Promise<import("mcp-from-openapi").ResolvedSecurity>;
56
+ export declare function resolveToolSecurity(tool: McpOpenAPITool, ctx: FrontMcpContext, options: Pick<OpenApiAdapterOptions, 'securityResolver' | 'authProviderMapper' | 'staticAuth' | 'passthroughCallerToken'>): Promise<import("mcp-from-openapi").ResolvedSecurity>;
57
57
  //# sourceMappingURL=openapi.security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.security.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.security.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,YAAY,CAAC,GAC7F,OAAO,CAAC,eAAe,CAAC,CA0G1B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,IAAI,CACX,qBAAqB,EACrB,kBAAkB,GAAG,oBAAoB,GAAG,YAAY,GAAG,iBAAiB,GAAG,wBAAwB,CACxG,GACA,wBAAwB,CA6F1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,GAAG,oBAAoB,GAAG,YAAY,CAAC,wDAwC/F"}
1
+ {"version":3,"file":"openapi.security.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.security.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEtH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,IAAI,CACX,qBAAqB,EACrB,kBAAkB,GAAG,oBAAoB,GAAG,YAAY,GAAG,wBAAwB,CACpF,GACA,OAAO,CAAC,eAAe,CAAC,CA+G1B;AAwBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAY3E;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,IAAI,CACX,qBAAqB,EACnB,kBAAkB,GAClB,oBAAoB,GACpB,YAAY,GACZ,iBAAiB,GACjB,wBAAwB,GACxB,wBAAwB,CAC3B,GACA,wBAAwB,CAsG1B;AAkCD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,IAAI,CACX,qBAAqB,EACrB,kBAAkB,GAAG,oBAAoB,GAAG,YAAY,GAAG,wBAAwB,CACpF,wDAyCF"}
@@ -638,6 +638,9 @@ interface BaseOptions {
638
638
  * Static authentication configuration when not using dynamic auth from context.
639
639
  * Useful for server-to-server APIs with static credentials.
640
640
  *
641
+ * With an `authProviderMapper`, it fills every credential no mapper function returned (a mapped
642
+ * value wins), so the caller's token (`passthroughCallerToken`) is never used alongside it.
643
+ *
641
644
  * @example
642
645
  * ```typescript
643
646
  * staticAuth: {
@@ -647,6 +650,20 @@ interface BaseOptions {
647
650
  * ```
648
651
  */
649
652
  staticAuth?: Partial<SecurityContext>;
653
+ /**
654
+ * Forward the MCP client's own bearer token (`ctx.authInfo.token`) to the API when no other
655
+ * credential source (`authProviderMapper`, `staticAuth`) supplied a credential.
656
+ *
657
+ * Off by default: the caller's token was issued for this MCP server, and sending it to another
658
+ * service is token passthrough, which the MCP specification forbids. Without this option an
659
+ * operation that requires authentication fails when the adapter has no credential for it.
660
+ * Enable it only when the API is meant to accept the same token (same issuer and audience).
661
+ * It also covers a security scheme with no `authProviderMapper` entry, which is otherwise refused
662
+ * at startup.
663
+ *
664
+ * @default false
665
+ */
666
+ passthroughCallerToken?: boolean;
650
667
  /**
651
668
  * Options for loading the OpenAPI specification.
652
669
  *
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.types.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACpH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAMrE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uEAAuE;IACvE,GAAG,EAAE,eAAe,CAAC;IACrB,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,sCAAsC;IACtC,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpE;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;IAE3C;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,cAAc,EAAE,CAAC;CACxD;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAElC;;OAEG;IACH,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAElC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC,CAAC;CACJ;AAMD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,aAAa,GAAG,iBAAiB,GAAG,UAAU,GAAG,MAAM,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,MAAM,CAAC,CAAC;IAEzE;;;;;;;;;;;;;;OAcG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,KAAK,MAAM,CAAC,CAAC;IAEvF;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B;;OAEG;IACH,EAAE,CAAC,EAAE,YAAY,CAAC;IAElB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;OAEG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAExC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,aAAa,GAAG,SAAS,CAAC;CACjE;AAMD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,aAAa,GAAG,MAAM,CAAC;AAErE;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yCAAyC;IACzC,IAAI,EAAE,cAAc,CAAC;IACrB,oCAAoC;IACpC,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uBAAuB;IACvB,IAAI,EAAE,cAAc,CAAC;IACrB,oCAAoC;IACpC,cAAc,EAAE,qBAAqB,CAAC;IACtC,oCAAoC;IACpC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACvC,MAAM,EAAE,cAAc,EACtB,GAAG,EAAE,wBAAwB,KAC1B,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,sBAAsB,KAAK,CAAC,CAAC;AAElG;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,4CAA4C;IAC5C,MAAM,CAAC,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAC3C,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,iBAAiB,CAAC,cAAc,CAAC,GAAG,SAAS,CAAC;CACrF;AAED;;;GAGG;AACH,MAAM,WAAW,4BAA4B;IAC3C,4CAA4C;IAC5C,MAAM,CAAC,EAAE,iBAAiB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC;IACvD,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC;IACxE,kCAAkC;IAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,iBAAiB,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CACjG;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,CAAC,EAAE,2BAA2B,CAAC;IAEpC;;;OAGG;IACH,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAExB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,qBAAqB,CAAC;IAE1C;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,0BAA0B,CAAC;CACnD;AAMD;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,IAAI,EAAE,cAAc,CAAC;IACrB,oCAAoC;IACpC,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,+BAA+B;IAC/B,GAAG,EAAE,eAAe,CAAC;IACrB,yCAAyC;IACzC,IAAI,EAAE,cAAc,CAAC;IACrB,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,EAAE,EAAE,OAAO,CAAC;IACZ,oCAAoC;IACpC,cAAc,EAAE,qBAAqB,CAAC;CACvC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,eAAe,CAAC,EAAE,CAChB,YAAY,EAAE,cAAc,GAAG,SAAS,EACxC,GAAG,EAAE,uBAAuB,KACzB,cAAc,GAAG,SAAS,CAAC;IAEhC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CACrB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,cAAc,GAAG,SAAS,EACxC,GAAG,EAAE,uBAAuB,KACzB,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,wBAAwB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAExF;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,wBAAwB,KAAK,OAAO,CAAC;CACrD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE;QAClB,4CAA4C;QAC5C,MAAM,CAAC,EAAE,gBAAgB,CAAC;QAC1B,6CAA6C;QAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAC3C,kCAAkC;QAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,gBAAgB,GAAG,SAAS,CAAC;KACpE,CAAC;IAEF;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACnB,gDAAgD;QAChD,MAAM,CAAC,EAAE,iBAAiB,CAAC;QAC3B,6CAA6C;QAC7C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAC5C,kCAAkC;QAClC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,iBAAiB,GAAG,SAAS,CAAC;KACrE,CAAC;CACH;AAMD;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,YAAY;IACxD;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR,gDAAgD;QAChD,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;QACnC,mCAAmC;QACnC,aAAa,CAAC,EAAE,aAAa,CAAC;QAC9B,uEAAuE;QACvE,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;QAClC,wEAAwE;QACxE,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;QACtC,8CAA8C;QAC9C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,qDAAqD;QACrD,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;KACvC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC;IAC9E,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,UAAU,WAAW;IACnB;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC;IAEpE;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9F;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,eAAe,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE9G;;;;;;;;;;;;;;;;;;OAkBG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC;IAElF;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAEtC;;;;;;;;;;OAUG;IACH,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE3C;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;IAE1C;;;;;;;;;;;;;;;;;;OAkBG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAEnC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;OAGG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,EAAE,iBAAiB,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;CACpD;AAED,UAAU,WAAY,SAAQ,WAAW;IACvC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC;CAC1D;AAED,UAAU,UAAW,SAAQ,WAAW;IACtC;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,UAAU,CAAC"}
1
+ {"version":3,"file":"openapi.types.d.ts","sourceRoot":"","sources":["../../src/openapi/openapi.types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontmcp/adapters",
3
- "version": "1.8.2",
3
+ "version": "1.8.3",
4
4
  "description": "Adapters for the FrontMCP framework",
5
5
  "author": "AgentFront <info@agentfront.dev>",
6
6
  "homepage": "https://docs.agentfront.dev",
@@ -64,15 +64,15 @@
64
64
  "node": ">=24.0.0"
65
65
  },
66
66
  "dependencies": {
67
- "@frontmcp/auth": "1.8.2",
68
- "@frontmcp/di": "1.8.2",
69
- "@frontmcp/sdk": "1.8.2",
70
- "@frontmcp/utils": "1.8.2",
67
+ "@frontmcp/auth": "1.8.3",
68
+ "@frontmcp/di": "1.8.3",
69
+ "@frontmcp/sdk": "1.8.3",
70
+ "@frontmcp/utils": "1.8.3",
71
71
  "js-yaml": "^4.1.0",
72
72
  "mcp-from-openapi": "2.8.0",
73
73
  "openapi-types": "^12.1.3"
74
74
  },
75
75
  "peerDependencies": {
76
- "@frontmcp/lazy-zod": "1.8.2"
76
+ "@frontmcp/lazy-zod": "1.8.3"
77
77
  }
78
78
  }
package/skills/index.js CHANGED
@@ -709,7 +709,13 @@ var npmSourceSchema = import_lazy_zod2.z.object({
709
709
  exportName: import_lazy_zod2.z.string().optional(),
710
710
  /**
711
711
  * Verify GitHub artifact attestation / npm provenance for the package before loading.
712
- * Defaults to true. Set false (with warning) only for local development packages.
712
+ * Defaults to true. Provenance verification is not implemented yet, so `true` refuses
713
+ * to load the package; set `false` to load it without a provenance check.
714
+ *
715
+ * With `false`, the package is imported (its code runs) before the bundle is parsed, so
716
+ * bundle signing (`requireSignature` + `trustedKeys`) cannot protect the import itself.
717
+ * Only use it for a package you trust: pin its exact version in `package.json` and
718
+ * install from a lockfile with integrity hashes.
713
719
  */
714
720
  verifyProvenance: import_lazy_zod2.z.boolean().default(true)
715
721
  });
@@ -717,11 +723,15 @@ var saasSourceSchema = import_lazy_zod2.z.object({
717
723
  type: import_lazy_zod2.z.literal("saas"),
718
724
  /** SaaS pull endpoint, e.g. `https://cloud.frontmcp.dev/v1/bundles/<bundleId>`. */
719
725
  endpoint: httpsUrl,
720
- /** Pinned JWT issued by the SaaS for the customer's FrontMCP server. */
726
+ /**
727
+ * Pinned JWT issued by the SaaS for the customer's FrontMCP server. Verified
728
+ * before every pull: signed by a key in `jwksUrl`, `iss` = `expectedIssuer`,
729
+ * `aud` includes `expectedAudience`, not expired. A rejected token stops the pull.
730
+ */
721
731
  authToken: import_lazy_zod2.z.string().min(1),
722
732
  /**
723
- * RFC 8707 resource indicator the JWT must encode. The plugin verifies
724
- * `resource` AND `aud` claims match this on every push/pull.
733
+ * RFC 8707 resource indicator the JWT must encode: its `aud` claim must include
734
+ * this value (and its `resource` claim too, when it has one).
725
735
  */
726
736
  expectedAudience: import_lazy_zod2.z.string().min(1),
727
737
  /** Polling interval in ms (boot pull is always immediate). Default 300000 (5 min). */
@@ -731,9 +741,9 @@ var saasSourceSchema = import_lazy_zod2.z.object({
731
741
  * updates synchronously. Default false in v1.2 (interval polling only).
732
742
  */
733
743
  enableWebhook: import_lazy_zod2.z.boolean().default(false),
734
- /** JWKS URL for verifying SaaS-issued tokens. */
744
+ /** JWKS URL for verifying SaaS-issued tokens (fetched without credentials, redirects refused). */
735
745
  jwksUrl: httpsUrl,
736
- /** Expected issuer (`iss`) claim. */
746
+ /** Expected issuer (`iss`) claim of `authToken`. */
737
747
  expectedIssuer: import_lazy_zod2.z.string().min(1)
738
748
  });
739
749
  var inlineSourceSchema = import_lazy_zod2.z.object({
@@ -831,8 +841,8 @@ var NpmSource = class {
831
841
  }
832
842
  async loadBundleFromPackage() {
833
843
  if (this.options.verifyProvenance) {
834
- this.logger.warn(
835
- `[npm-source] verifyProvenance=true requested but provenance verification is not yet implemented in OSS (planned v1.2.x). Loading "${this.options.packageName}" without provenance check.`
844
+ throw new Error(
845
+ `npm source "${this.options.packageName}": verifyProvenance is true, but npm provenance verification is not implemented, so the package was not loaded. Set verifyProvenance: false to load it without a provenance check, only for a package you trust: importing it runs its code before any bundle signature is checked, so pin its exact version and install it from a lockfile with integrity hashes.`
836
846
  );
837
847
  }
838
848
  const mod = await this.dynamicImport(this.options.packageName);
@@ -867,9 +877,33 @@ var NpmSource = class {
867
877
  };
868
878
 
869
879
  // libs/adapters/src/skills/sources/saas-pull.source.ts
880
+ var import_auth = require("@frontmcp/auth");
870
881
  var import_utils = require("@frontmcp/utils");
871
882
  var DEFAULT_CACHE_DIR = ".frontmcp/skilled-openapi";
872
883
  var DEFAULT_PULL_TIMEOUT_MS = 3e4;
884
+ var USER_AGENT = "frontmcp-skilled-openapi";
885
+ var SaasPullTokenRejectedError = class extends Error {
886
+ constructor(reason) {
887
+ super(`[saas-source] pull token rejected: ${reason}`);
888
+ this.name = "SaasPullTokenRejectedError";
889
+ }
890
+ };
891
+ function claimValues(claim) {
892
+ if (Array.isArray(claim)) return claim;
893
+ return claim === void 0 ? [] : [claim];
894
+ }
895
+ var PUBLIC_KEY_MEMBERS = /* @__PURE__ */ new Map([
896
+ ["RSA", ["n", "e"]],
897
+ ["EC", ["crv", "x", "y"]],
898
+ ["OKP", ["crv", "x"]]
899
+ ]);
900
+ function isUsableSigningKey(key) {
901
+ if (typeof key !== "object" || key === null) return false;
902
+ const jwk = key;
903
+ const members = typeof jwk["kty"] === "string" ? PUBLIC_KEY_MEMBERS.get(jwk["kty"]) : void 0;
904
+ if (!members || jwk["use"] !== void 0 && jwk["use"] !== "sig") return false;
905
+ return members.every((m) => typeof jwk[m] === "string" && jwk[m] !== "");
906
+ }
873
907
  var SaasPullSource = class {
874
908
  constructor(options, cacheDir, logger, deps = {}) {
875
909
  this.options = options;
@@ -887,6 +921,7 @@ var SaasPullSource = class {
887
921
  pollHandle;
888
922
  inFlight = false;
889
923
  stopped = false;
924
+ jwksService = new import_auth.JwksService({});
890
925
  async start() {
891
926
  if (this.stopped || this.inFlight) {
892
927
  this.schedulePoll();
@@ -899,6 +934,7 @@ var SaasPullSource = class {
899
934
  bundle = await this.fetchOnce();
900
935
  await this.persistCache(bundle);
901
936
  } catch (e) {
937
+ if (e instanceof SaasPullTokenRejectedError) throw e;
902
938
  this.logger.warn(
903
939
  `[saas-source] initial pull failed (${e.message}); attempting cached bundle fallback`
904
940
  );
@@ -970,7 +1006,11 @@ var SaasPullSource = class {
970
1006
  await this.persistCache(bundle);
971
1007
  this.notify(bundle);
972
1008
  } catch (e) {
973
- this.logger.warn(`[saas-source] poll failed: ${e.message}`);
1009
+ if (e instanceof SaasPullTokenRejectedError) {
1010
+ this.logger.error(`[saas-source] poll refused: ${e.message}; keeping the current bundle`);
1011
+ } else {
1012
+ this.logger.warn(`[saas-source] poll failed: ${e.message}`);
1013
+ }
974
1014
  } finally {
975
1015
  this.inFlight = false;
976
1016
  this.schedulePoll();
@@ -991,11 +1031,53 @@ var SaasPullSource = class {
991
1031
  clearTimeout(timer);
992
1032
  }
993
1033
  }
1034
+ /**
1035
+ * Verify the pinned pull token against the issuer's JWKS, issuer and audience.
1036
+ * Throws {@link SaasPullTokenRejectedError} when the token is refused, and a
1037
+ * plain Error when the JWKS can't be fetched (an outage).
1038
+ */
1039
+ async verifyPullToken() {
1040
+ const { jwksUrl, expectedIssuer, expectedAudience, authToken } = this.options;
1041
+ const { status, body } = await this.httpGet(jwksUrl, { Accept: "application/json", "User-Agent": USER_AGENT });
1042
+ if (status < 200 || status >= 300) {
1043
+ throw new Error(`JWKS ${jwksUrl} responded ${status}`);
1044
+ }
1045
+ let jwks;
1046
+ try {
1047
+ jwks = JSON.parse(body);
1048
+ } catch {
1049
+ throw new Error(`JWKS ${jwksUrl} is not valid JSON`);
1050
+ }
1051
+ if (!jwks || !Array.isArray(jwks.keys) || jwks.keys.length === 0) {
1052
+ throw new Error(`JWKS ${jwksUrl} has no keys`);
1053
+ }
1054
+ const signingKeys = jwks.keys.filter(isUsableSigningKey);
1055
+ if (signingKeys.length === 0) {
1056
+ throw new Error(`JWKS ${jwksUrl} has no usable signing keys`);
1057
+ }
1058
+ const verified = await this.jwksService.verifyTransparentToken(authToken, [
1059
+ { id: "skilled-openapi-saas", issuerUrl: expectedIssuer, jwks: { keys: signingKeys } }
1060
+ ]);
1061
+ if (!verified.ok || !verified.payload) {
1062
+ throw new SaasPullTokenRejectedError(
1063
+ `not a valid token from issuer "${expectedIssuer}" signed by a key in ${jwksUrl} (${verified.error ?? "verification failed"})`
1064
+ );
1065
+ }
1066
+ const payload = verified.payload;
1067
+ if (!claimValues(payload["aud"]).includes(expectedAudience)) {
1068
+ throw new SaasPullTokenRejectedError(`its "aud" claim does not include "${expectedAudience}"`);
1069
+ }
1070
+ const resource = claimValues(payload["resource"]);
1071
+ if (resource.length > 0 && !resource.includes(expectedAudience)) {
1072
+ throw new SaasPullTokenRejectedError(`its "resource" claim does not include "${expectedAudience}"`);
1073
+ }
1074
+ }
994
1075
  async fetchOnce() {
1076
+ await this.verifyPullToken();
995
1077
  const { status, body } = await this.httpGet(this.options.endpoint, {
996
1078
  Authorization: `Bearer ${this.options.authToken}`,
997
1079
  Accept: "application/json, application/yaml",
998
- "User-Agent": "frontmcp-skilled-openapi"
1080
+ "User-Agent": USER_AGENT
999
1081
  });
1000
1082
  if (status < 200 || status >= 300) {
1001
1083
  throw new Error(`pull responded ${status}`);
@@ -1609,13 +1691,13 @@ function verifyBundleSignature(bundle, trustedKeys, telemetry) {
1609
1691
  }
1610
1692
 
1611
1693
  // libs/adapters/src/skills/security/jwt-verifier.ts
1612
- var import_auth = require("@frontmcp/auth");
1694
+ var import_auth2 = require("@frontmcp/auth");
1613
1695
  var DEFAULT_REQUIRED_ROLES = ["frontmcp:cloud:push"];
1614
1696
  var BundlePushJwtVerifier = class {
1615
1697
  constructor(options, logger, jwks) {
1616
1698
  this.options = options;
1617
1699
  this.logger = logger;
1618
- this.jwks = jwks ?? new import_auth.JwksService({});
1700
+ this.jwks = jwks ?? new import_auth2.JwksService({});
1619
1701
  this.providerRef = {
1620
1702
  id: "skilled-openapi-cloud-push",
1621
1703
  issuerUrl: options.expectedIssuer,
@@ -1 +1 @@
1
- {"version":3,"file":"source-options.d.ts","sourceRoot":"","sources":["../../src/skills/source-options.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAkBvC,eAAO,MAAM,kBAAkB;;;;gCAM7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;gCAW1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;gCAsB3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;gCAS7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;0CAK7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIrE,eAAO,MAAM,kBAAkB;;;;;;;gCAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}
1
+ {"version":3,"file":"source-options.d.ts","sourceRoot":"","sources":["../../src/skills/source-options.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAkBvC,eAAO,MAAM,kBAAkB;;;;gCAM7B,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;gCAiB1B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;gCA0B3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;gCAS7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;0CAK7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC/D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AACrE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAIrE,eAAO,MAAM,kBAAkB;;;;;;;gCAO7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC"}