ostacky 0.9.4 → 0.9.5

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 (113) hide show
  1. package/README.md +27 -25
  2. package/assets/agents/ostacky.md +3 -3
  3. package/assets/commands/install-stack.md +2 -2
  4. package/assets/mcp/ostacky-controller/bun.lock +20 -0
  5. package/assets/mcp/ostacky-controller/index.js +80 -19
  6. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts → auth--n_Yzytt.d.cts} +14 -9
  7. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts.map → auth--n_Yzytt.d.cts.map} +1 -1
  8. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CfDMXiII.cjs → auth-4-zilcqg.cjs} +3 -2
  9. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-4-zilcqg.cjs.map +1 -0
  10. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CUe6YdwF.mjs → auth-CGP0BDVq.mjs} +3 -2
  11. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CGP0BDVq.mjs.map +1 -0
  12. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts → auth-YUQV3RRv.d.mts} +14 -9
  13. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts.map → auth-YUQV3RRv.d.mts.map} +1 -1
  14. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
  15. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
  16. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
  17. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
  18. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
  19. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
  20. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
  21. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
  22. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/package.json +1 -1
  23. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/README.md +3 -3
  24. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-CplOkyLC.mjs → ajvProvider-CEoC__sr.mjs} +483 -38
  25. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CEoC__sr.mjs.map +1 -0
  26. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts → ajvProvider-CgI-5L6O.d.mts} +25 -8
  27. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts.map → ajvProvider-CgI-5L6O.d.mts.map} +1 -1
  28. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts → ajvProvider-FOQRM7up.d.cts} +24 -7
  29. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts.map → ajvProvider-FOQRM7up.d.cts.map} +1 -1
  30. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-Brn-Q2J_.cjs → ajvProvider-ZaoO9afR.cjs} +483 -38
  31. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-ZaoO9afR.cjs.map +1 -0
  32. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-ojcZaap3.cjs → cfWorkerProvider-BwbPzsdI.cjs} +25 -15
  33. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BwbPzsdI.cjs.map +1 -0
  34. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-BYRW5af5.d.mts → cfWorkerProvider-C03CSigr.d.mts} +21 -6
  35. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-C03CSigr.d.mts.map +1 -0
  36. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-D9GAttn8.d.cts → cfWorkerProvider-doTkZbTr.d.cts} +20 -5
  37. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-doTkZbTr.d.cts.map +1 -0
  38. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-Bd-iTHAF.mjs → cfWorkerProvider-p3WaZPqB.mjs} +26 -15
  39. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-p3WaZPqB.mjs.map +1 -0
  40. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-DzBzpE4_.d.cts → createMcpHandler-BLVe3qmU.d.cts} +137 -32
  41. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +1 -0
  42. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-CEckaSEs.d.mts → createMcpHandler-Bt6U_Fqb.d.mts} +138 -33
  43. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +1 -0
  44. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs +46 -0
  45. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs.map +1 -0
  46. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs +34 -0
  47. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs.map +1 -0
  48. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs +209 -257
  49. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
  50. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts +45 -3
  51. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
  52. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts +46 -4
  53. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
  54. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs +201 -252
  55. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
  56. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-DM1iHYFo.cjs → mcp-DUcCQSTW.cjs} +458 -35
  57. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +1 -0
  58. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-IJurDZVN.mjs → mcp-Dw2OlZ1f.mjs} +389 -32
  59. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +1 -0
  60. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.cjs +1 -1
  61. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.cts +1 -1
  62. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.mts +1 -1
  63. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.mjs +1 -1
  64. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.cjs +1 -1
  65. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.cts +1 -1
  66. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.mts +1 -1
  67. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.mjs +1 -1
  68. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +2 -2
  69. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.cts +1 -1
  70. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.mts +1 -1
  71. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +2 -2
  72. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-BX_fm-dB.cjs → src-CgFsfg3E.cjs} +161 -48
  73. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +1 -0
  74. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-D86MbS1I.mjs → src-D-y6h4N7.mjs} +161 -48
  75. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +1 -0
  76. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +30 -3
  77. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs.map +1 -1
  78. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +9 -1
  79. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts.map +1 -1
  80. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +9 -1
  81. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts.map +1 -1
  82. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +30 -3
  83. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs.map +1 -1
  84. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts → types-DUs7mGBv.d.mts} +1 -1
  85. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts.map → types-DUs7mGBv.d.mts.map} +1 -1
  86. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.cjs +1 -1
  87. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.cts +1 -1
  88. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.mts +1 -1
  89. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.mjs +1 -1
  90. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.cjs +1 -1
  91. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.cts +1 -1
  92. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.mts +1 -1
  93. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.mjs +1 -1
  94. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/package.json +4 -4
  95. package/assets/mcp/ostacky-controller/package.json +1 -1
  96. package/assets/plugins/ostacky-controller/index.ts +43 -8
  97. package/dist/cli.js +93 -53
  98. package/manifest.json +28 -28
  99. package/package.json +5 -1
  100. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CUe6YdwF.mjs.map +0 -1
  101. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CfDMXiII.cjs.map +0 -1
  102. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-Brn-Q2J_.cjs.map +0 -1
  103. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CplOkyLC.mjs.map +0 -1
  104. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BYRW5af5.d.mts.map +0 -1
  105. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-Bd-iTHAF.mjs.map +0 -1
  106. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-D9GAttn8.d.cts.map +0 -1
  107. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-ojcZaap3.cjs.map +0 -1
  108. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CEckaSEs.d.mts.map +0 -1
  109. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DzBzpE4_.d.cts.map +0 -1
  110. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DM1iHYFo.cjs.map +0 -1
  111. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-IJurDZVN.mjs.map +0 -1
  112. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-BX_fm-dB.cjs.map +0 -1
  113. package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-D86MbS1I.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  const require_chunk = require('./chunk-Bnu9O96Y.cjs');
2
- const require_src = require('./src-BX_fm-dB.cjs');
2
+ const require_src = require('./src-CgFsfg3E.cjs');
3
3
  let _modelcontextprotocol_server__shims = require("@modelcontextprotocol/server/_shims");
4
4
  let _modelcontextprotocol_core_internal = require("@modelcontextprotocol/core/internal");
5
5
 
@@ -58,6 +58,19 @@ function getCompleter(schema) {
58
58
  return schema[COMPLETABLE_SYMBOL]?.complete;
59
59
  }
60
60
 
61
+ //#endregion
62
+ //#region src/server/sseKeepAlive.ts
63
+ /** Default interval between SSE keep-alive comment frames. */
64
+ const DEFAULT_SSE_KEEP_ALIVE_MS = 15e3;
65
+ const MAX_TIMER_DELAY_MS = 2 ** 31 - 1;
66
+ /** Arms an unref'd timer, or disables keep-alive for invalid delays. */
67
+ function armSseKeepAlive(intervalMs, onTick) {
68
+ if (!Number.isFinite(intervalMs) || intervalMs < 1) return;
69
+ const timer = setInterval(onTick, Math.min(intervalMs, MAX_TIMER_DELAY_MS));
70
+ timer.unref?.();
71
+ return timer;
72
+ }
73
+
61
74
  //#endregion
62
75
  //#region src/server/serverEventBus.ts
63
76
  /**
@@ -170,8 +183,6 @@ function serverEventToNotification(event) {
170
183
 
171
184
  //#endregion
172
185
  //#region src/server/listenRouter.ts
173
- /** Default SSE comment-frame keepalive interval for listen streams. */
174
- const DEFAULT_LISTEN_KEEPALIVE_MS = 15e3;
175
186
  /** Default capacity guard: refuse a new subscription when this many are already open. */
176
187
  const DEFAULT_MAX_SUBSCRIPTIONS = 1024;
177
188
  function jsonRpcError(id, code, message) {
@@ -210,7 +221,7 @@ function parseListenFilter(message) {
210
221
  function createListenRouter(options) {
211
222
  const { bus, onerror } = options;
212
223
  const maxSubscriptions = options.maxSubscriptions ?? DEFAULT_MAX_SUBSCRIPTIONS;
213
- const keepAliveMs = options.keepAliveMs ?? DEFAULT_LISTEN_KEEPALIVE_MS;
224
+ const keepAliveMs = options.keepAliveMs ?? DEFAULT_SSE_KEEP_ALIVE_MS;
214
225
  const open = /* @__PURE__ */ new Set();
215
226
  function serve(message, signal, capabilities, serverInfo) {
216
227
  if (open.size >= maxSubscriptions) {
@@ -256,7 +267,11 @@ function createListenRouter(options) {
256
267
  }
257
268
  })}\n\n`);
258
269
  closed = true;
259
- unsubscribe?.();
270
+ try {
271
+ unsubscribe?.();
272
+ } catch (error) {
273
+ onerror?.(error instanceof Error ? error : new Error(String(error)));
274
+ }
260
275
  if (keepAliveTimer !== void 0) clearInterval(keepAliveTimer);
261
276
  abortCleanup?.();
262
277
  open.delete(teardown);
@@ -277,10 +292,7 @@ function createListenRouter(options) {
277
292
  const note = stampSubscriptionId(serverEventToNotification(event), subscriptionId);
278
293
  writeNotification(note.method, note.params);
279
294
  });
280
- if (keepAliveMs > 0) {
281
- keepAliveTimer = setInterval(() => writeFrame(": keepalive\n\n"), keepAliveMs);
282
- keepAliveTimer.unref?.();
283
- }
295
+ keepAliveTimer = armSseKeepAlive(keepAliveMs, () => writeFrame(": keepalive\n\n"));
284
296
  open.add(teardown);
285
297
  },
286
298
  cancel() {
@@ -297,7 +309,7 @@ function createListenRouter(options) {
297
309
  status: 200,
298
310
  headers: {
299
311
  "Content-Type": "text/event-stream",
300
- "Cache-Control": "no-cache",
312
+ "Cache-Control": "no-cache, no-transform",
301
313
  Connection: "keep-alive",
302
314
  "X-Accel-Buffering": "no"
303
315
  }
@@ -464,6 +476,310 @@ function notificationToServerEvent(method, uri) {
464
476
  }
465
477
  }
466
478
 
479
+ //#endregion
480
+ //#region src/server/middleware/bearerAuth.ts
481
+ function headerQuotedValue(value) {
482
+ return value.replaceAll(/[\\"]/g, String.raw`\$&`).replaceAll(/[^\u0020-\u007E]/g, " ");
483
+ }
484
+ /**
485
+ * Build a `WWW-Authenticate: Bearer …` challenge header value (RFC 6750).
486
+ *
487
+ * The single formatter behind every challenge this package emits — the
488
+ * bearer-auth 401/403 answers and the per-operation scope-challenge 403 — so
489
+ * all challenges from one server agree on parameter order and quoting. Every
490
+ * parameter value is emitted as an HTTP quoted-string with `\` and `"`
491
+ * escaped and non-printable characters replaced.
492
+ */
493
+ function buildWwwAuthenticateHeader(errorCode, description, requiredScopes, resourceMetadataUrl) {
494
+ let header = `Bearer error="${headerQuotedValue(errorCode)}", error_description="${headerQuotedValue(description)}"`;
495
+ if (requiredScopes.length > 0) header += `, scope="${headerQuotedValue(requiredScopes.join(" "))}"`;
496
+ if (resourceMetadataUrl) header += `, resource_metadata="${headerQuotedValue(resourceMetadataUrl)}"`;
497
+ return header;
498
+ }
499
+ /**
500
+ * Validate a raw `Authorization` header value as a Bearer token and return
501
+ * the verified {@link AuthInfo}.
502
+ *
503
+ * The runtime-neutral core of Bearer authentication: it parses the header,
504
+ * runs the verifier, enforces `requiredScopes`, and rejects tokens without an
505
+ * expiration or past it. On any failure it throws an {@link OAuthError} —
506
+ * pass that to {@link bearerAuthChallengeResponse} for the matching HTTP
507
+ * answer, or use {@link requireBearerAuth} to get both steps as one call.
508
+ *
509
+ * Framework adapters build on this: `requireBearerAuth` from
510
+ * `@modelcontextprotocol/express` feeds it `req.headers.authorization`.
511
+ */
512
+ async function verifyBearerToken(authorizationHeader, options) {
513
+ const { verifier, requiredScopes = [] } = options;
514
+ if (!authorizationHeader) throw new require_src.OAuthError(require_src.OAuthErrorCode.InvalidToken, "Missing Authorization header");
515
+ const [type, token] = authorizationHeader.split(" ");
516
+ if (type?.toLowerCase() !== "bearer" || !token) throw new require_src.OAuthError(require_src.OAuthErrorCode.InvalidToken, "Invalid Authorization header format, expected 'Bearer TOKEN'");
517
+ const authInfo = await verifier.verifyAccessToken(token);
518
+ if (requiredScopes.length > 0) {
519
+ if (!requiredScopes.every((scope) => authInfo.scopes.includes(scope))) throw new require_src.OAuthError(require_src.OAuthErrorCode.InsufficientScope, "Insufficient scope");
520
+ }
521
+ if (typeof authInfo.expiresAt !== "number" || Number.isNaN(authInfo.expiresAt)) throw new require_src.OAuthError(require_src.OAuthErrorCode.InvalidToken, "Token has no expiration time");
522
+ else if (authInfo.expiresAt < Date.now() / 1e3) throw new require_src.OAuthError(require_src.OAuthErrorCode.InvalidToken, "Token has expired");
523
+ if (options.resourceMetadataUrl !== void 0 && authInfo.resourceMetadataUrl === void 0) return {
524
+ ...authInfo,
525
+ resourceMetadataUrl: options.resourceMetadataUrl
526
+ };
527
+ return authInfo;
528
+ }
529
+ /**
530
+ * Build the HTTP answer for a Bearer authentication failure.
531
+ *
532
+ * Maps an {@link OAuthError} to its status — `401` for `invalid_token` and
533
+ * `403` for `insufficient_scope` (both carrying the `WWW-Authenticate: Bearer …`
534
+ * challenge, with `resource_metadata` when configured so clients can discover
535
+ * the Authorization Server), `500` for `server_error`, `400` for anything
536
+ * else. A non-`OAuthError` value answers `500 server_error`. The body is the
537
+ * OAuth error JSON.
538
+ */
539
+ function bearerAuthChallengeResponse(error, options) {
540
+ const { requiredScopes = [], resourceMetadataUrl } = options ?? {};
541
+ if (!(error instanceof require_src.OAuthError)) {
542
+ const serverError = new require_src.OAuthError(require_src.OAuthErrorCode.ServerError, "Internal Server Error");
543
+ return Response.json(serverError.toResponseObject(), { status: 500 });
544
+ }
545
+ switch (error.code) {
546
+ case require_src.OAuthErrorCode.InvalidToken: {
547
+ const challenge = buildWwwAuthenticateHeader(error.code, error.message, requiredScopes, resourceMetadataUrl);
548
+ return Response.json(error.toResponseObject(), {
549
+ status: 401,
550
+ headers: { "WWW-Authenticate": challenge }
551
+ });
552
+ }
553
+ case require_src.OAuthErrorCode.InsufficientScope: {
554
+ const challenge = buildWwwAuthenticateHeader(error.code, error.message, requiredScopes, resourceMetadataUrl);
555
+ return Response.json(error.toResponseObject(), {
556
+ status: 403,
557
+ headers: { "WWW-Authenticate": challenge }
558
+ });
559
+ }
560
+ case require_src.OAuthErrorCode.ServerError: return Response.json(error.toResponseObject(), { status: 500 });
561
+ default: return Response.json(error.toResponseObject(), { status: 400 });
562
+ }
563
+ }
564
+ /**
565
+ * Require a valid Bearer token on web-standard requests.
566
+ *
567
+ * The framework-free counterpart of `requireBearerAuth` from
568
+ * `@modelcontextprotocol/express`, for hosts whose HTTP surface is a
569
+ * `fetch(request)` handler — Cloudflare Workers, Deno, Bun, Hono. The
570
+ * returned gate resolves to the verified {@link AuthInfo}, or to the
571
+ * ready-to-return challenge `Response` when the request must be refused.
572
+ *
573
+ * @example
574
+ * ```ts source="./bearerAuth.examples.ts#requireBearerAuth_fetchGate"
575
+ * const gate = requireBearerAuth({ verifier, requiredScopes: ['mcp'] });
576
+ *
577
+ * async function fetchHandler(request: Request): Promise<Response> {
578
+ * const auth: AuthInfo | Response = await gate(request);
579
+ * if (auth instanceof Response) return auth;
580
+ * return handler.fetch(request, { authInfo: auth });
581
+ * }
582
+ * ```
583
+ */
584
+ function requireBearerAuth(options) {
585
+ const { verifier, requiredScopes = [], resourceMetadataUrl } = options;
586
+ const resolved = {
587
+ verifier,
588
+ requiredScopes,
589
+ resourceMetadataUrl
590
+ };
591
+ return async (request) => {
592
+ const [authorizationHeader] = (request.headers.get("authorization") ?? "").split(",");
593
+ try {
594
+ return await verifyBearerToken(authorizationHeader || void 0, resolved);
595
+ } catch (error) {
596
+ return bearerAuthChallengeResponse(error, resolved);
597
+ }
598
+ };
599
+ }
600
+
601
+ //#endregion
602
+ //#region src/server/middleware/oauthMetadata.ts
603
+ function checkIssuerUrl(issuer, allowInsecure) {
604
+ if (issuer.protocol !== "https:" && issuer.hostname !== "localhost" && issuer.hostname !== "127.0.0.1" && !allowInsecure) throw new Error("Issuer URL must be HTTPS");
605
+ if (issuer.hash) throw new Error(`Issuer URL must not have a fragment: ${issuer}`);
606
+ if (issuer.search) throw new Error(`Issuer URL must not have a query string: ${issuer}`);
607
+ }
608
+ /**
609
+ * Derive the RFC 9728 Protected Resource Metadata document from
610
+ * {@link AuthMetadataOptions}, validating the Authorization Server issuer URL
611
+ * (HTTPS required outside localhost) in the process.
612
+ *
613
+ * `oauthMetadataResponse` and the Express `mcpAuthMetadataRouter` both build
614
+ * on this; use it directly when serving the document through your own
615
+ * routing — or call it once at startup to fail fast on a misconfigured
616
+ * issuer before any request arrives.
617
+ */
618
+ function buildOAuthProtectedResourceMetadata(options) {
619
+ checkIssuerUrl(new URL(options.oauthMetadata.issuer), options.dangerouslyAllowInsecureIssuerUrl);
620
+ return {
621
+ resource: options.resourceServerUrl.href,
622
+ authorization_servers: [options.oauthMetadata.issuer],
623
+ scopes_supported: options.scopesSupported,
624
+ resource_name: options.resourceName,
625
+ resource_documentation: options.serviceDocumentationUrl?.href
626
+ };
627
+ }
628
+ /**
629
+ * Builds the RFC 9728 Protected Resource Metadata URL for a given MCP server
630
+ * URL by inserting `/.well-known/oauth-protected-resource` ahead of the path.
631
+ *
632
+ * @example
633
+ * ```ts
634
+ * getOAuthProtectedResourceMetadataUrl(new URL('https://api.example.com/mcp'))
635
+ * // → 'https://api.example.com/.well-known/oauth-protected-resource/mcp'
636
+ * ```
637
+ */
638
+ function getOAuthProtectedResourceMetadataUrl(serverUrl) {
639
+ const metadataUrl = new URL(serverUrl);
640
+ metadataUrl.pathname = protectedResourceMetadataPath(serverUrl);
641
+ metadataUrl.hash = "";
642
+ return metadataUrl.href;
643
+ }
644
+ /** The RFC 9728 path-aware well-known path for a resource URL. */
645
+ function protectedResourceMetadataPath(resourceServerUrl) {
646
+ const rsPath = stripTrailingSlash(resourceServerUrl.pathname);
647
+ return `/.well-known/oauth-protected-resource${rsPath === "/" ? "" : rsPath}`;
648
+ }
649
+ function stripTrailingSlash(path) {
650
+ return path.length > 1 && path.endsWith("/") ? path.slice(0, -1) : path;
651
+ }
652
+ const ALLOWED_METHODS = "GET, HEAD, OPTIONS";
653
+ function metadataDocumentResponse(request, metadata) {
654
+ if (request.method === "OPTIONS") {
655
+ const requestedHeaders = request.headers.get("access-control-request-headers");
656
+ return new Response(null, {
657
+ status: 204,
658
+ headers: {
659
+ "Access-Control-Allow-Origin": "*",
660
+ "Access-Control-Allow-Methods": ALLOWED_METHODS,
661
+ ...requestedHeaders === null ? {} : {
662
+ "Access-Control-Allow-Headers": requestedHeaders,
663
+ Vary: "Access-Control-Request-Headers"
664
+ }
665
+ }
666
+ });
667
+ }
668
+ if (request.method !== "GET" && request.method !== "HEAD") {
669
+ const error = new require_src.OAuthError(require_src.OAuthErrorCode.MethodNotAllowed, `The method ${request.method} is not allowed for this endpoint`);
670
+ return Response.json(error.toResponseObject(), {
671
+ status: 405,
672
+ headers: {
673
+ Allow: ALLOWED_METHODS,
674
+ "Access-Control-Allow-Origin": "*"
675
+ }
676
+ });
677
+ }
678
+ const response = Response.json(metadata, { headers: { "Access-Control-Allow-Origin": "*" } });
679
+ return request.method === "HEAD" ? new Response(null, {
680
+ status: response.status,
681
+ headers: response.headers
682
+ }) : response;
683
+ }
684
+ /**
685
+ * Serve the two OAuth discovery documents an MCP server acting as a Resource
686
+ * Server exposes, from a web-standard `fetch(request)` handler:
687
+ *
688
+ * - `/.well-known/oauth-protected-resource[/<path>]` — RFC 9728 Protected
689
+ * Resource Metadata, derived from the supplied options (path-aware: the
690
+ * resource URL's path is reflected in the route).
691
+ * - `/.well-known/oauth-authorization-server` — RFC 8414 Authorization
692
+ * Server Metadata, passed through verbatim.
693
+ *
694
+ * Returns the matched document `Response` (JSON with permissive CORS, `405`
695
+ * with an `Allow` header for non-GET methods, `204` for CORS preflight), or
696
+ * `undefined` when the request path is neither well-known route — fall
697
+ * through to your own routing. The framework-free counterpart of
698
+ * `mcpAuthMetadataRouter` from `@modelcontextprotocol/express`; pair it with
699
+ * `requireBearerAuth` and `getOAuthProtectedResourceMetadataUrl` so
700
+ * unauthenticated clients can discover the AS from the `401` challenge.
701
+ *
702
+ * @example
703
+ * ```ts source="./oauthMetadata.examples.ts#oauthMetadataResponse_fetchHandler"
704
+ * async function fetchHandler(request: Request): Promise<Response> {
705
+ * return oauthMetadataResponse(request, options) ?? serveMcp(request);
706
+ * }
707
+ * ```
708
+ */
709
+ function oauthMetadataResponse(request, options) {
710
+ const requestPath = stripTrailingSlash(new URL(request.url).pathname);
711
+ if (requestPath === protectedResourceMetadataPath(options.resourceServerUrl)) return metadataDocumentResponse(request, buildOAuthProtectedResourceMetadata(options));
712
+ if (requestPath === "/.well-known/oauth-authorization-server") {
713
+ buildOAuthProtectedResourceMetadata(options);
714
+ return metadataDocumentResponse(request, options.oauthMetadata);
715
+ }
716
+ }
717
+
718
+ //#endregion
719
+ //#region src/server/scopeChallenge.ts
720
+ /** @internal */
721
+ function supportsScopeChallengeResolver(transport) {
722
+ return typeof transport === "object" && transport !== null && "setScopeChallengeResolver" in transport && typeof transport.setScopeChallengeResolver === "function";
723
+ }
724
+ function assertScope(scope, location) {
725
+ if (typeof scope !== "string" || !/^[\u0021\u0023-\u005B\u005D-\u007E]+$/.test(scope)) throw new TypeError(`${location} must satisfy the OAuth scope-token grammar`);
726
+ }
727
+ function validateScopeChallenge(challenge) {
728
+ if (challenge === null || typeof challenge !== "object" || !Array.isArray(challenge.scopes) || challenge.scopes.length === 0) throw new TypeError("scope challenge must contain at least one scope");
729
+ for (const [index, scope] of challenge.scopes.entries()) assertScope(scope, `scope challenge scopes[${index}]`);
730
+ if (challenge.errorDescription !== void 0 && typeof challenge.errorDescription !== "string") throw new TypeError("scope challenge errorDescription must be a string");
731
+ if (challenge.errorDescription !== void 0 && !/^[\u0020-\u0021\u0023-\u005B\u005D-\u007E]+$/.test(challenge.errorDescription)) throw new TypeError("scope challenge errorDescription must satisfy the RFC 6750 error-description grammar");
732
+ return challenge;
733
+ }
734
+ /**
735
+ * Creates a handler that requires every supplied scope exactly.
736
+ *
737
+ * Requests without authentication are left to the server's authentication gate.
738
+ */
739
+ function requireScopes(...scopes) {
740
+ if (scopes.length === 0) throw new TypeError("requireScopes must contain at least one scope");
741
+ for (const [index, scope] of scopes.entries()) assertScope(scope, `requireScopes scope[${index}]`);
742
+ const requiredScopes = [...scopes];
743
+ return ({ authInfo }) => {
744
+ if (authInfo === void 0) return;
745
+ const activeScopes = new Set(authInfo.scopes);
746
+ if (requiredScopes.every((scope) => activeScopes.has(scope))) return;
747
+ return { scopes: requiredScopes };
748
+ };
749
+ }
750
+ /** @internal */
751
+ async function findScopeChallenge(requests, authInfo, resolve) {
752
+ for (const request of requests) {
753
+ const challenge = await resolve({
754
+ request,
755
+ ...authInfo !== void 0 && { authInfo }
756
+ });
757
+ if (challenge !== void 0) return validateScopeChallenge(challenge);
758
+ }
759
+ }
760
+ /**
761
+ * The RFC 9728 Protected Resource Metadata URL to advertise on a scope
762
+ * challenge, derived from the verified {@link AuthInfo}: the URL the
763
+ * authentication gate stamped (`authInfo.resourceMetadataUrl`, set by the
764
+ * bearer-auth helpers from their `resourceMetadataUrl` option), falling back
765
+ * to the well-known location for an HTTP(S) RFC 8707 `resource` identifier, or
766
+ * `undefined` when neither is available (the `resource_metadata` parameter is
767
+ * then omitted, matching the bearer-auth challenges).
768
+ *
769
+ * @internal
770
+ */
771
+ function scopeChallengeResourceMetadataUrl(authInfo) {
772
+ if (authInfo?.resourceMetadataUrl !== void 0) return authInfo.resourceMetadataUrl;
773
+ if (authInfo?.resource?.protocol === "https:" || authInfo?.resource?.protocol === "http:") return getOAuthProtectedResourceMetadataUrl(authInfo.resource);
774
+ }
775
+ /** @internal */
776
+ function createScopeChallengeResponse(challenge, resourceMetadataUrl) {
777
+ return bearerAuthChallengeResponse(new require_src.OAuthError(require_src.OAuthErrorCode.InsufficientScope, challenge.errorDescription ?? "Insufficient scope"), {
778
+ requiredScopes: [...challenge.scopes],
779
+ resourceMetadataUrl
780
+ });
781
+ }
782
+
467
783
  //#endregion
468
784
  //#region src/server/legacyInputRequiredShim.ts
469
785
  /**
@@ -1205,7 +1521,7 @@ var Server = class extends require_src.Protocol {
1205
1521
  * notification for the specified elicitation ID.
1206
1522
  *
1207
1523
  * The notification (and the `elicitationId` it references) exists only on protocol revision
1208
- * 2025-11-25 — the 2026-07-28 draft removed both. On a connection negotiated at 2026-07-28 the
1524
+ * 2025-11-25 — the 2026-07-28 revision removed both. On a connection negotiated at 2026-07-28 the
1209
1525
  * returned callback rejects with a typed local error before anything reaches the transport
1210
1526
  * (the method is not part of that revision's wire registry).
1211
1527
  *
@@ -1353,6 +1669,7 @@ var McpServer = class {
1353
1669
  * ```
1354
1670
  */
1355
1671
  async connect(transport) {
1672
+ if (supportsScopeChallengeResolver(transport)) transport.setScopeChallengeResolver((context) => this.resolveScopeChallenge(context));
1356
1673
  return await this.server.connect(transport);
1357
1674
  }
1358
1675
  /**
@@ -1361,6 +1678,40 @@ var McpServer = class {
1361
1678
  async close() {
1362
1679
  await this.server.close();
1363
1680
  }
1681
+ /** @internal */
1682
+ resolveScopeChallenge = (context) => {
1683
+ switch (context.request.method) {
1684
+ case "tools/call": {
1685
+ const toolName = context.request.params?.name;
1686
+ if (typeof toolName !== "string") return;
1687
+ const tool = this._registeredTools[toolName];
1688
+ if (tool === void 0 || !tool.enabled) return;
1689
+ return tool.scopeChallenge?.(context);
1690
+ }
1691
+ case "resources/read": {
1692
+ const resourceUri = context.request.params?.uri;
1693
+ if (typeof resourceUri !== "string") return;
1694
+ let uri;
1695
+ try {
1696
+ uri = new URL(resourceUri);
1697
+ } catch {
1698
+ return;
1699
+ }
1700
+ const resource = this._registeredResources[uri.toString()];
1701
+ if (resource !== void 0) return resource.enabled ? resource.scopeChallenge?.(context) : void 0;
1702
+ for (const template of Object.values(this._registeredResourceTemplates)) if (template.resourceTemplate.uriTemplate.match(uri.toString())) return template.enabled ? template.scopeChallenge?.(context) : void 0;
1703
+ return;
1704
+ }
1705
+ case "prompts/get": {
1706
+ const promptName = context.request.params?.name;
1707
+ if (typeof promptName !== "string") return;
1708
+ const prompt = this._registeredPrompts[promptName];
1709
+ if (prompt === void 0 || !prompt.enabled) return;
1710
+ return prompt.scopeChallenge?.(context);
1711
+ }
1712
+ default: return;
1713
+ }
1714
+ };
1364
1715
  _toolHandlersInitialized = false;
1365
1716
  setToolRequestHandlers() {
1366
1717
  if (this._toolHandlersInitialized) return;
@@ -1526,7 +1877,10 @@ var McpServer = class {
1526
1877
  }
1527
1878
  for (const template of Object.values(this._registeredResourceTemplates)) {
1528
1879
  const variables = template.resourceTemplate.uriTemplate.match(uri.toString());
1529
- if (variables) return require_src.attachCacheHintFallback(await template.readCallback(uri, variables, ctx), template.cacheHint);
1880
+ if (variables) {
1881
+ if (!template.enabled) throw new require_src.ProtocolError(require_src.ProtocolErrorCode.InvalidParams, `Resource template ${template.resourceTemplate.uriTemplate} disabled`);
1882
+ return require_src.attachCacheHintFallback(await template.readCallback(uri, variables, ctx), template.cacheHint);
1883
+ }
1530
1884
  }
1531
1885
  throw new require_src.ResourceNotFoundError(request.params.uri);
1532
1886
  });
@@ -1557,36 +1911,32 @@ var McpServer = class {
1557
1911
  this._promptHandlersInitialized = true;
1558
1912
  }
1559
1913
  registerResource(name, uriOrTemplate, config, readCallback) {
1560
- const cacheHint = config.cacheHint;
1561
- let metadata = config;
1562
- if (cacheHint !== void 0) {
1563
- require_src.assertValidCacheHint(cacheHint, `resource ${name}`);
1564
- const rest = { ...config };
1565
- delete rest.cacheHint;
1566
- metadata = rest;
1567
- }
1914
+ const { cacheHint, scopeChallenge, ...resourceMetadata } = config;
1915
+ const metadata = resourceMetadata;
1916
+ if (cacheHint !== void 0) require_src.assertValidCacheHint(cacheHint, `resource ${name}`);
1568
1917
  if (typeof uriOrTemplate === "string") {
1569
1918
  if (this._registeredResources[uriOrTemplate]) throw new Error(`Resource ${uriOrTemplate} is already registered`);
1570
- const registeredResource = this._createRegisteredResource(name, config.title, uriOrTemplate, metadata, readCallback);
1919
+ const registeredResource = this._createRegisteredResource(name, config.title, uriOrTemplate, metadata, scopeChallenge, readCallback);
1571
1920
  if (cacheHint !== void 0) registeredResource.cacheHint = cacheHint;
1572
1921
  this.setResourceRequestHandlers();
1573
1922
  this.sendResourceListChanged();
1574
1923
  return registeredResource;
1575
1924
  } else {
1576
1925
  if (this._registeredResourceTemplates[name]) throw new Error(`Resource template ${name} is already registered`);
1577
- const registeredResourceTemplate = this._createRegisteredResourceTemplate(name, config.title, uriOrTemplate, metadata, readCallback);
1926
+ const registeredResourceTemplate = this._createRegisteredResourceTemplate(name, config.title, uriOrTemplate, metadata, scopeChallenge, readCallback);
1578
1927
  if (cacheHint !== void 0) registeredResourceTemplate.cacheHint = cacheHint;
1579
1928
  this.setResourceRequestHandlers();
1580
1929
  this.sendResourceListChanged();
1581
1930
  return registeredResourceTemplate;
1582
1931
  }
1583
1932
  }
1584
- _createRegisteredResource(name, title, uri, metadata, readCallback) {
1933
+ _createRegisteredResource(name, title, uri, metadata, scopeChallenge, readCallback) {
1585
1934
  const registeredResource = {
1586
1935
  name,
1587
1936
  title,
1588
1937
  metadata,
1589
1938
  readCallback,
1939
+ scopeChallenge,
1590
1940
  enabled: true,
1591
1941
  disable: () => registeredResource.update({ enabled: false }),
1592
1942
  enable: () => registeredResource.update({ enabled: true }),
@@ -1600,6 +1950,7 @@ var McpServer = class {
1600
1950
  if (updates.title !== void 0) registeredResource.title = updates.title;
1601
1951
  if (updates.metadata !== void 0) registeredResource.metadata = updates.metadata;
1602
1952
  if (updates.callback !== void 0) registeredResource.readCallback = updates.callback;
1953
+ if (updates.scopeChallenge !== void 0) registeredResource.scopeChallenge = updates.scopeChallenge === null ? void 0 : updates.scopeChallenge;
1603
1954
  if (updates.enabled !== void 0) registeredResource.enabled = updates.enabled;
1604
1955
  this.sendResourceListChanged();
1605
1956
  }
@@ -1607,12 +1958,13 @@ var McpServer = class {
1607
1958
  this._registeredResources[uri] = registeredResource;
1608
1959
  return registeredResource;
1609
1960
  }
1610
- _createRegisteredResourceTemplate(name, title, template, metadata, readCallback) {
1961
+ _createRegisteredResourceTemplate(name, title, template, metadata, scopeChallenge, readCallback) {
1611
1962
  const registeredResourceTemplate = {
1612
1963
  resourceTemplate: template,
1613
1964
  title,
1614
1965
  metadata,
1615
1966
  readCallback,
1967
+ scopeChallenge,
1616
1968
  enabled: true,
1617
1969
  disable: () => registeredResourceTemplate.update({ enabled: false }),
1618
1970
  enable: () => registeredResourceTemplate.update({ enabled: true }),
@@ -1626,6 +1978,7 @@ var McpServer = class {
1626
1978
  if (updates.template !== void 0) registeredResourceTemplate.resourceTemplate = updates.template;
1627
1979
  if (updates.metadata !== void 0) registeredResourceTemplate.metadata = updates.metadata;
1628
1980
  if (updates.callback !== void 0) registeredResourceTemplate.readCallback = updates.callback;
1981
+ if (updates.scopeChallenge !== void 0) registeredResourceTemplate.scopeChallenge = updates.scopeChallenge === null ? void 0 : updates.scopeChallenge;
1629
1982
  if (updates.enabled !== void 0) registeredResourceTemplate.enabled = updates.enabled;
1630
1983
  this.sendResourceListChanged();
1631
1984
  }
@@ -1635,7 +1988,7 @@ var McpServer = class {
1635
1988
  if (Array.isArray(variableNames) && variableNames.some((v) => !!template.completeCallback(v))) this.setCompletionRequestHandler();
1636
1989
  return registeredResourceTemplate;
1637
1990
  }
1638
- _createRegisteredPrompt(name, title, description, argsSchema, callback, icons, _meta) {
1991
+ _createRegisteredPrompt(name, title, description, argsSchema, callback, icons, scopeChallenge, _meta) {
1639
1992
  let currentArgsSchema = argsSchema;
1640
1993
  let currentCallback = callback;
1641
1994
  const registeredPrompt = {
@@ -1643,6 +1996,7 @@ var McpServer = class {
1643
1996
  description,
1644
1997
  argsSchema,
1645
1998
  icons,
1999
+ scopeChallenge,
1646
2000
  _meta,
1647
2001
  handler: createPromptHandler(name, argsSchema, callback),
1648
2002
  enabled: true,
@@ -1657,6 +2011,7 @@ var McpServer = class {
1657
2011
  if (updates.title !== void 0) registeredPrompt.title = updates.title;
1658
2012
  if (updates.description !== void 0) registeredPrompt.description = updates.description;
1659
2013
  if (updates.icons !== void 0) registeredPrompt.icons = updates.icons;
2014
+ if (updates.scopeChallenge !== void 0) registeredPrompt.scopeChallenge = updates.scopeChallenge === null ? void 0 : updates.scopeChallenge;
1660
2015
  if (updates._meta !== void 0) registeredPrompt._meta = updates._meta;
1661
2016
  let needsHandlerRegen = false;
1662
2017
  if (updates.argsSchema !== void 0) {
@@ -1684,7 +2039,7 @@ var McpServer = class {
1684
2039
  }
1685
2040
  return registeredPrompt;
1686
2041
  }
1687
- _createRegisteredTool(name, title, description, inputSchema, outputSchema, annotations, icons, execution, _meta, handler) {
2042
+ _createRegisteredTool(name, title, description, inputSchema, outputSchema, annotations, icons, execution, scopeChallenge, _meta, handler) {
1688
2043
  require_src.validateAndWarnToolName(name);
1689
2044
  if (inputSchema !== void 0) try {
1690
2045
  const json = require_src.standardSchemaToJsonSchema(inputSchema, "input");
@@ -1702,6 +2057,7 @@ var McpServer = class {
1702
2057
  annotations,
1703
2058
  icons,
1704
2059
  execution,
2060
+ scopeChallenge,
1705
2061
  _meta,
1706
2062
  handler,
1707
2063
  executor: createToolExecutor(inputSchema, handler),
@@ -1740,6 +2096,7 @@ var McpServer = class {
1740
2096
  }
1741
2097
  if (updates.annotations !== void 0) registeredTool.annotations = updates.annotations;
1742
2098
  if (updates.icons !== void 0) registeredTool.icons = updates.icons;
2099
+ if (updates.scopeChallenge !== void 0) registeredTool.scopeChallenge = updates.scopeChallenge === null ? void 0 : updates.scopeChallenge;
1743
2100
  if (updates._meta !== void 0) registeredTool._meta = updates._meta;
1744
2101
  if (updates.enabled !== void 0) registeredTool.enabled = updates.enabled;
1745
2102
  this.sendToolListChanged();
@@ -1752,13 +2109,13 @@ var McpServer = class {
1752
2109
  }
1753
2110
  registerTool(name, config, cb) {
1754
2111
  if (this._registeredTools[name]) throw new Error(`Tool ${name} is already registered`);
1755
- const { title, description, inputSchema, outputSchema, annotations, icons, _meta } = config;
1756
- return this._createRegisteredTool(name, title, description, require_src.normalizeRawShapeSchema(inputSchema), require_src.normalizeRawShapeSchema(outputSchema), annotations, icons, void 0, _meta, cb);
2112
+ const { title, description, inputSchema, outputSchema, annotations, icons, scopeChallenge, _meta } = config;
2113
+ return this._createRegisteredTool(name, title, description, require_src.normalizeRawShapeSchema(inputSchema), require_src.normalizeRawShapeSchema(outputSchema), annotations, icons, void 0, scopeChallenge, _meta, cb);
1757
2114
  }
1758
2115
  registerPrompt(name, config, cb) {
1759
2116
  if (this._registeredPrompts[name]) throw new Error(`Prompt ${name} is already registered`);
1760
- const { title, description, argsSchema, icons, _meta } = config;
1761
- const registeredPrompt = this._createRegisteredPrompt(name, title, description, require_src.normalizeRawShapeSchema(argsSchema), cb, icons, _meta);
2117
+ const { title, description, argsSchema, icons, scopeChallenge, _meta } = config;
2118
+ const registeredPrompt = this._createRegisteredPrompt(name, title, description, require_src.normalizeRawShapeSchema(argsSchema), cb, icons, scopeChallenge, _meta);
1762
2119
  this.setPromptRequestHandlers();
1763
2120
  this.sendPromptListChanged();
1764
2121
  return registeredPrompt;
@@ -1917,16 +2274,16 @@ function unwrapOptionalSchema(schema) {
1917
2274
  }
1918
2275
 
1919
2276
  //#endregion
1920
- Object.defineProperty(exports, 'DEFAULT_LISTEN_KEEPALIVE_MS', {
2277
+ Object.defineProperty(exports, 'DEFAULT_MAX_SUBSCRIPTIONS', {
1921
2278
  enumerable: true,
1922
2279
  get: function () {
1923
- return DEFAULT_LISTEN_KEEPALIVE_MS;
2280
+ return DEFAULT_MAX_SUBSCRIPTIONS;
1924
2281
  }
1925
2282
  });
1926
- Object.defineProperty(exports, 'DEFAULT_MAX_SUBSCRIPTIONS', {
2283
+ Object.defineProperty(exports, 'DEFAULT_SSE_KEEP_ALIVE_MS', {
1927
2284
  enumerable: true,
1928
2285
  get: function () {
1929
- return DEFAULT_MAX_SUBSCRIPTIONS;
2286
+ return DEFAULT_SSE_KEEP_ALIVE_MS;
1930
2287
  }
1931
2288
  });
1932
2289
  Object.defineProperty(exports, 'InMemoryServerEventBus', {
@@ -1959,6 +2316,24 @@ Object.defineProperty(exports, 'StdioListenRouter', {
1959
2316
  return StdioListenRouter;
1960
2317
  }
1961
2318
  });
2319
+ Object.defineProperty(exports, 'armSseKeepAlive', {
2320
+ enumerable: true,
2321
+ get: function () {
2322
+ return armSseKeepAlive;
2323
+ }
2324
+ });
2325
+ Object.defineProperty(exports, 'bearerAuthChallengeResponse', {
2326
+ enumerable: true,
2327
+ get: function () {
2328
+ return bearerAuthChallengeResponse;
2329
+ }
2330
+ });
2331
+ Object.defineProperty(exports, 'buildOAuthProtectedResourceMetadata', {
2332
+ enumerable: true,
2333
+ get: function () {
2334
+ return buildOAuthProtectedResourceMetadata;
2335
+ }
2336
+ });
1962
2337
  Object.defineProperty(exports, 'completable', {
1963
2338
  enumerable: true,
1964
2339
  get: function () {
@@ -1971,12 +2346,30 @@ Object.defineProperty(exports, 'createListenRouter', {
1971
2346
  return createListenRouter;
1972
2347
  }
1973
2348
  });
2349
+ Object.defineProperty(exports, 'createScopeChallengeResponse', {
2350
+ enumerable: true,
2351
+ get: function () {
2352
+ return createScopeChallengeResponse;
2353
+ }
2354
+ });
1974
2355
  Object.defineProperty(exports, 'createServerNotifier', {
1975
2356
  enumerable: true,
1976
2357
  get: function () {
1977
2358
  return createServerNotifier;
1978
2359
  }
1979
2360
  });
2361
+ Object.defineProperty(exports, 'findScopeChallenge', {
2362
+ enumerable: true,
2363
+ get: function () {
2364
+ return findScopeChallenge;
2365
+ }
2366
+ });
2367
+ Object.defineProperty(exports, 'getOAuthProtectedResourceMetadataUrl', {
2368
+ enumerable: true,
2369
+ get: function () {
2370
+ return getOAuthProtectedResourceMetadataUrl;
2371
+ }
2372
+ });
1980
2373
  Object.defineProperty(exports, 'installModernOnlyHandlers', {
1981
2374
  enumerable: true,
1982
2375
  get: function () {
@@ -1989,6 +2382,30 @@ Object.defineProperty(exports, 'isCompletable', {
1989
2382
  return isCompletable;
1990
2383
  }
1991
2384
  });
2385
+ Object.defineProperty(exports, 'oauthMetadataResponse', {
2386
+ enumerable: true,
2387
+ get: function () {
2388
+ return oauthMetadataResponse;
2389
+ }
2390
+ });
2391
+ Object.defineProperty(exports, 'requireBearerAuth', {
2392
+ enumerable: true,
2393
+ get: function () {
2394
+ return requireBearerAuth;
2395
+ }
2396
+ });
2397
+ Object.defineProperty(exports, 'requireScopes', {
2398
+ enumerable: true,
2399
+ get: function () {
2400
+ return requireScopes;
2401
+ }
2402
+ });
2403
+ Object.defineProperty(exports, 'scopeChallengeResourceMetadataUrl', {
2404
+ enumerable: true,
2405
+ get: function () {
2406
+ return scopeChallengeResourceMetadataUrl;
2407
+ }
2408
+ });
1992
2409
  Object.defineProperty(exports, 'seedClientIdentityFromEnvelope', {
1993
2410
  enumerable: true,
1994
2411
  get: function () {
@@ -2001,4 +2418,10 @@ Object.defineProperty(exports, 'serverIdentityOf', {
2001
2418
  return serverIdentityOf;
2002
2419
  }
2003
2420
  });
2004
- //# sourceMappingURL=mcp-DM1iHYFo.cjs.map
2421
+ Object.defineProperty(exports, 'verifyBearerToken', {
2422
+ enumerable: true,
2423
+ get: function () {
2424
+ return verifyBearerToken;
2425
+ }
2426
+ });
2427
+ //# sourceMappingURL=mcp-DUcCQSTW.cjs.map