ostacky 0.9.3 → 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.
- package/README.md +27 -25
- package/assets/agents/ostacky.md +5 -4
- package/assets/commands/install-stack.md +2 -2
- package/assets/mcp/ostacky-controller/bun.lock +20 -0
- package/assets/mcp/ostacky-controller/index.js +185 -29
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts → auth--n_Yzytt.d.cts} +14 -9
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts.map → auth--n_Yzytt.d.cts.map} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CfDMXiII.cjs → auth-4-zilcqg.cjs} +3 -2
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-4-zilcqg.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CUe6YdwF.mjs → auth-CGP0BDVq.mjs} +3 -2
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CGP0BDVq.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-CVhIKulL.d.mts → auth-YUQV3RRv.d.mts} +14 -9
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/{auth-B2Q9_Vxp.d.cts.map → auth-YUQV3RRv.d.mts.map} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/index.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/internal.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/package.json +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/README.md +3 -3
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-CplOkyLC.mjs → ajvProvider-CEoC__sr.mjs} +483 -38
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CEoC__sr.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts → ajvProvider-CgI-5L6O.d.mts} +25 -8
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-BdSo9BII.d.mts.map → ajvProvider-CgI-5L6O.d.mts.map} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts → ajvProvider-FOQRM7up.d.cts} +24 -7
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-B_4czhCS.d.cts.map → ajvProvider-FOQRM7up.d.cts.map} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{ajvProvider-Brn-Q2J_.cjs → ajvProvider-ZaoO9afR.cjs} +483 -38
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-ZaoO9afR.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-ojcZaap3.cjs → cfWorkerProvider-BwbPzsdI.cjs} +25 -15
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BwbPzsdI.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-BYRW5af5.d.mts → cfWorkerProvider-C03CSigr.d.mts} +21 -6
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-C03CSigr.d.mts.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-D9GAttn8.d.cts → cfWorkerProvider-doTkZbTr.d.cts} +20 -5
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-doTkZbTr.d.cts.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{cfWorkerProvider-Bd-iTHAF.mjs → cfWorkerProvider-p3WaZPqB.mjs} +26 -15
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-p3WaZPqB.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-DzBzpE4_.d.cts → createMcpHandler-BLVe3qmU.d.cts} +137 -32
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-BLVe3qmU.d.cts.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{createMcpHandler-CEckaSEs.d.mts → createMcpHandler-Bt6U_Fqb.d.mts} +138 -33
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-Bt6U_Fqb.d.mts.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs +46 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-D8eXzoGv.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs +34 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/dialects-DoSzNhcb.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs +209 -257
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.cjs.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts +45 -3
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.cts.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts +46 -4
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.d.mts.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs +201 -252
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/index.mjs.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-DM1iHYFo.cjs → mcp-DUcCQSTW.cjs} +458 -35
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DUcCQSTW.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{mcp-IJurDZVN.mjs → mcp-Dw2OlZ1f.mjs} +389 -32
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-Dw2OlZ1f.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsBrowser.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsNode.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.cjs +2 -2
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/shimsWorkerd.mjs +2 -2
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-BX_fm-dB.cjs → src-CgFsfg3E.cjs} +161 -48
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-CgFsfg3E.cjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{src-D86MbS1I.mjs → src-D-y6h4N7.mjs} +161 -48
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-D-y6h4N7.mjs.map +1 -0
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs +30 -3
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.cjs.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts +9 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.cts.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts +9 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.d.mts.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs +30 -3
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/stdio.mjs.map +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts → types-DUs7mGBv.d.mts} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/{types-mS0yxCL0.d.mts.map → types-DUs7mGBv.d.mts.map} +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/ajv.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.cjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.cts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.d.mts +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/validators/cfWorker.mjs +1 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/package.json +4 -4
- package/assets/mcp/ostacky-controller/package.json +1 -1
- package/assets/plugins/ostacky-controller/index.ts +53 -11
- package/dist/cli.js +93 -53
- package/manifest.json +28 -28
- package/package.json +5 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CUe6YdwF.mjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/core/dist/auth-CfDMXiII.cjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-Brn-Q2J_.cjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/ajvProvider-CplOkyLC.mjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-BYRW5af5.d.mts.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-Bd-iTHAF.mjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-D9GAttn8.d.cts.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/cfWorkerProvider-ojcZaap3.cjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-CEckaSEs.d.mts.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/createMcpHandler-DzBzpE4_.d.cts.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-DM1iHYFo.cjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/mcp-IJurDZVN.mjs.map +0 -1
- package/assets/mcp/ostacky-controller/node_modules/@modelcontextprotocol/server/dist/src-BX_fm-dB.cjs.map +0 -1
- 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-
|
|
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 ??
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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)
|
|
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
|
|
1561
|
-
|
|
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, '
|
|
2277
|
+
Object.defineProperty(exports, 'DEFAULT_MAX_SUBSCRIPTIONS', {
|
|
1921
2278
|
enumerable: true,
|
|
1922
2279
|
get: function () {
|
|
1923
|
-
return
|
|
2280
|
+
return DEFAULT_MAX_SUBSCRIPTIONS;
|
|
1924
2281
|
}
|
|
1925
2282
|
});
|
|
1926
|
-
Object.defineProperty(exports, '
|
|
2283
|
+
Object.defineProperty(exports, 'DEFAULT_SSE_KEEP_ALIVE_MS', {
|
|
1927
2284
|
enumerable: true,
|
|
1928
2285
|
get: function () {
|
|
1929
|
-
return
|
|
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
|
-
|
|
2421
|
+
Object.defineProperty(exports, 'verifyBearerToken', {
|
|
2422
|
+
enumerable: true,
|
|
2423
|
+
get: function () {
|
|
2424
|
+
return verifyBearerToken;
|
|
2425
|
+
}
|
|
2426
|
+
});
|
|
2427
|
+
//# sourceMappingURL=mcp-DUcCQSTW.cjs.map
|