mcp-use 2.0.0-beta.6 → 2.0.0-beta.7

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 (43) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/chunk-FC2Z2VFO.js +99 -0
  3. package/dist/chunk-FC2Z2VFO.js.map +1 -0
  4. package/dist/chunk-FCGJJVL2.js +739 -0
  5. package/dist/chunk-FCGJJVL2.js.map +1 -0
  6. package/dist/{chunk-PMPGMSYA.js → chunk-QUUANIE4.js} +27 -80
  7. package/dist/chunk-QUUANIE4.js.map +1 -0
  8. package/dist/chunk-STCR3P5O.js +95 -0
  9. package/dist/chunk-STCR3P5O.js.map +1 -0
  10. package/dist/chunk-Z326HADF.js +82 -0
  11. package/dist/chunk-Z326HADF.js.map +1 -0
  12. package/dist/commands/build.js +5 -2
  13. package/dist/commands/build.js.map +1 -1
  14. package/dist/config.d.ts +12 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/fetch-app.d.ts +26 -0
  17. package/dist/fetch-app.d.ts.map +1 -1
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +47 -19
  21. package/dist/index.js.map +1 -1
  22. package/dist/inspector-shell.d.ts +1 -1
  23. package/dist/inspector-shell.d.ts.map +1 -1
  24. package/dist/landing-handler-VQRYCQOV.js +31 -0
  25. package/dist/landing-handler-VQRYCQOV.js.map +1 -0
  26. package/dist/landing-handler.d.ts +22 -0
  27. package/dist/landing-handler.d.ts.map +1 -0
  28. package/dist/landing.d.ts +65 -0
  29. package/dist/landing.d.ts.map +1 -0
  30. package/dist/landing.js +7 -0
  31. package/dist/landing.js.map +1 -0
  32. package/dist/oauth/better-auth.d.ts +29 -0
  33. package/dist/oauth/better-auth.d.ts.map +1 -0
  34. package/dist/oauth/better-auth.js +76 -0
  35. package/dist/oauth/better-auth.js.map +1 -0
  36. package/dist/oauth/index.js +2 -1
  37. package/dist/server.d.ts.map +1 -1
  38. package/dist/views/document.d.ts.map +1 -1
  39. package/dist/views/routes.d.ts.map +1 -1
  40. package/package.json +10 -2
  41. package/dist/chunk-PMPGMSYA.js.map +0 -1
  42. package/dist/chunk-VV2P4ZFZ.js +0 -187
  43. package/dist/chunk-VV2P4ZFZ.js.map +0 -1
@@ -10,7 +10,7 @@
10
10
  * public hostname.
11
11
  */
12
12
  import type { InspectorOptions } from "./config.js";
13
- import type { FetchHandler } from "./fetch-app.js";
13
+ import { type FetchHandler } from "./fetch-app.js";
14
14
  /**
15
15
  * npm dist-tag of the `@mcp-use/inspector` CDN bundle the default URL follows.
16
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"inspector-shell.d.ts","sourceRoot":"","sources":["../src/inspector-shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,+EAA2F,CAAC;AAErI;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,2EAA2E;AAC3E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAOT;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAiE3E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,gBAAgB,GAAG,SAAS,EACvC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChD,YAAY,GAAG,SAAS,CA+B1B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
1
+ {"version":3,"file":"inspector-shell.d.ts","sourceRoot":"","sources":["../src/inspector-shell.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElE;;;;;GAKG;AACH,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,+EAA2F,CAAC;AAErI;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,2EAA2E;AAC3E,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,8EAA8E;AAC9E,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAOT;AAED,+CAA+C;AAC/C,MAAM,WAAW,qBAAqB;IACpC,mDAAmD;IACnD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,gEAAgE;IAChE,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAuBD;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,MAAM,CAiE3E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,gBAAgB,GAAG,SAAS,EACvC,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAChD,YAAY,GAAG,SAAS,CA+B1B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
@@ -0,0 +1,31 @@
1
+ import {
2
+ generateLandingPage
3
+ } from "./chunk-FCGJJVL2.js";
4
+ import {
5
+ resolveServerOrigin
6
+ } from "./chunk-FC2Z2VFO.js";
7
+
8
+ // src/landing-handler.ts
9
+ function createLandingPageResponse(request, basePath, config, tools, prompts, resources) {
10
+ const origin = resolveServerOrigin(request);
11
+ const url = new URL(basePath, `${origin}/`).href;
12
+ const html = generateLandingPage({
13
+ ...config,
14
+ url,
15
+ tools: Array.from(tools, (entry) => entry.definition),
16
+ prompts: Array.from(prompts, (entry) => entry.definition),
17
+ resources: Array.from(resources, (entry) => entry.definition)
18
+ });
19
+ return new Response(request.method === "HEAD" ? null : html, {
20
+ status: 200,
21
+ headers: {
22
+ "cache-control": "no-store",
23
+ "content-type": "text/html; charset=utf-8",
24
+ "x-content-type-options": "nosniff"
25
+ }
26
+ });
27
+ }
28
+ export {
29
+ createLandingPageResponse
30
+ };
31
+ //# sourceMappingURL=landing-handler-VQRYCQOV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/landing-handler.ts"],"sourcesContent":["import {\n generateLandingPage,\n type LandingPageOptions,\n type LandingPagePrompt,\n type LandingPageResource,\n type LandingPageTool,\n} from \"./landing.js\";\nimport { resolveServerOrigin } from \"./views/origin.js\";\n\n/**\n * Render a landing-page response without loading the renderer on MCP requests.\n *\n * @param request - Classified HTML GET or HEAD request.\n * @param basePath - Exact MCP endpoint path.\n * @param config - Server identity and description.\n * @param tools - Frozen tool registry values.\n * @param prompts - Frozen prompt registry values.\n * @param resources - Frozen static-resource registry values.\n * @returns HTML response, with an empty body for HEAD.\n *\n * @internal\n */\nexport function createLandingPageResponse(\n request: Request,\n basePath: string,\n config: Pick<\n LandingPageOptions,\n \"name\" | \"title\" | \"version\" | \"description\"\n >,\n tools: Iterable<{ definition: LandingPageTool }>,\n prompts: Iterable<{ definition: LandingPagePrompt }>,\n resources: Iterable<{ definition: LandingPageResource }>\n): Response {\n const origin = resolveServerOrigin(request);\n const url = new URL(basePath, `${origin}/`).href;\n const html = generateLandingPage({\n ...config,\n url,\n tools: Array.from(tools, (entry) => entry.definition),\n prompts: Array.from(prompts, (entry) => entry.definition),\n resources: Array.from(resources, (entry) => entry.definition),\n });\n return new Response(request.method === \"HEAD\" ? null : html, {\n status: 200,\n headers: {\n \"cache-control\": \"no-store\",\n \"content-type\": \"text/html; charset=utf-8\",\n \"x-content-type-options\": \"nosniff\",\n },\n });\n}\n"],"mappings":";;;;;;;;AAsBO,SAAS,0BACd,SACA,UACA,QAIA,OACA,SACA,WACU;AACV,QAAM,SAAS,oBAAoB,OAAO;AAC1C,QAAM,MAAM,IAAI,IAAI,UAAU,GAAG,MAAM,GAAG,EAAE;AAC5C,QAAM,OAAO,oBAAoB;AAAA,IAC/B,GAAG;AAAA,IACH;AAAA,IACA,OAAO,MAAM,KAAK,OAAO,CAAC,UAAU,MAAM,UAAU;AAAA,IACpD,SAAS,MAAM,KAAK,SAAS,CAAC,UAAU,MAAM,UAAU;AAAA,IACxD,WAAW,MAAM,KAAK,WAAW,CAAC,UAAU,MAAM,UAAU;AAAA,EAC9D,CAAC;AACD,SAAO,IAAI,SAAS,QAAQ,WAAW,SAAS,OAAO,MAAM;AAAA,IAC3D,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,0BAA0B;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,22 @@
1
+ import { type LandingPageOptions, type LandingPagePrompt, type LandingPageResource, type LandingPageTool } from "./landing.js";
2
+ /**
3
+ * Render a landing-page response without loading the renderer on MCP requests.
4
+ *
5
+ * @param request - Classified HTML GET or HEAD request.
6
+ * @param basePath - Exact MCP endpoint path.
7
+ * @param config - Server identity and description.
8
+ * @param tools - Frozen tool registry values.
9
+ * @param prompts - Frozen prompt registry values.
10
+ * @param resources - Frozen static-resource registry values.
11
+ * @returns HTML response, with an empty body for HEAD.
12
+ *
13
+ * @internal
14
+ */
15
+ export declare function createLandingPageResponse(request: Request, basePath: string, config: Pick<LandingPageOptions, "name" | "title" | "version" | "description">, tools: Iterable<{
16
+ definition: LandingPageTool;
17
+ }>, prompts: Iterable<{
18
+ definition: LandingPagePrompt;
19
+ }>, resources: Iterable<{
20
+ definition: LandingPageResource;
21
+ }>): Response;
22
+ //# sourceMappingURL=landing-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landing-handler.d.ts","sourceRoot":"","sources":["../src/landing-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAGtB;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,CACV,kBAAkB,EAClB,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,aAAa,CAC7C,EACD,KAAK,EAAE,QAAQ,CAAC;IAAE,UAAU,EAAE,eAAe,CAAA;CAAE,CAAC,EAChD,OAAO,EAAE,QAAQ,CAAC;IAAE,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAAC,EACpD,SAAS,EAAE,QAAQ,CAAC;IAAE,UAAU,EAAE,mBAAmB,CAAA;CAAE,CAAC,GACvD,QAAQ,CAkBV"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Landing page generator for MCP server endpoints
3
+ *
4
+ * Generates SEO-friendly HTML with connection instructions for MCP servers
5
+ * from Claude Code, Cursor, VS Code, ChatGPT, and Manufact Inspector (hosted).
6
+ */
7
+ /** A tool shown in the landing page's primitives list. */
8
+ export interface LandingPageTool {
9
+ /** Protocol-facing tool name. */
10
+ name: string;
11
+ /** Optional human-readable tool title. */
12
+ title?: string;
13
+ /** Optional tool description. */
14
+ description?: string;
15
+ }
16
+ /** A prompt shown in the landing page's primitives list. */
17
+ export interface LandingPagePrompt {
18
+ /** Protocol-facing prompt name. */
19
+ name: string;
20
+ /** Optional human-readable prompt title. */
21
+ title?: string;
22
+ /** Optional prompt description. */
23
+ description?: string;
24
+ }
25
+ /** A static resource shown in the landing page's primitives list. */
26
+ export interface LandingPageResource {
27
+ /** Resource URI. */
28
+ uri: string;
29
+ /** Optional protocol-facing resource name. */
30
+ name?: string;
31
+ /** Optional human-readable resource title. */
32
+ title?: string;
33
+ /** Optional resource description. */
34
+ description?: string;
35
+ }
36
+ /** Inputs used to render the v1-compatible MCP server landing page. */
37
+ export interface LandingPageOptions {
38
+ /** Protocol-facing server name. */
39
+ name: string;
40
+ /** Optional human-readable server title used as the page heading. */
41
+ title?: string;
42
+ /** Server version shown beside the heading. */
43
+ version: string;
44
+ /** Absolute public URL of the MCP endpoint. */
45
+ url: string;
46
+ /** Optional server description. */
47
+ description?: string;
48
+ /** Optional tools shown in the primitives list. */
49
+ tools?: readonly LandingPageTool[];
50
+ /** Optional prompts shown in the primitives list. */
51
+ prompts?: readonly LandingPagePrompt[];
52
+ /** Optional static resources shown in the primitives list. */
53
+ resources?: readonly LandingPageResource[];
54
+ /** Optional absolute URL for the icon displayed above the server heading. */
55
+ iconUrl?: string;
56
+ }
57
+ /**
58
+ * Generates an HTML landing page with connection instructions
59
+ * for Claude Code, Cursor, VS Code, ChatGPT, and Manufact Inspector.
60
+ *
61
+ * @param options - Server identity, endpoint, icon, and primitive metadata.
62
+ * @returns HTML landing page with connection instructions
63
+ */
64
+ export declare function generateLandingPage(options: LandingPageOptions): string;
65
+ //# sourceMappingURL=landing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landing.d.ts","sourceRoot":"","sources":["../src/landing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoQH,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4DAA4D;AAC5D,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qEAAqE;AACrE,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IAEZ,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uEAAuE;AACvE,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IAEb,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAEhB,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IAEZ,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,KAAK,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAEnC,qDAAqD;IACrD,OAAO,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAEvC,8DAA8D;IAC9D,SAAS,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAE3C,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAujBvE"}
@@ -0,0 +1,7 @@
1
+ import {
2
+ generateLandingPage
3
+ } from "./chunk-FCGJJVL2.js";
4
+ export {
5
+ generateLandingPage
6
+ };
7
+ //# sourceMappingURL=landing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,29 @@
1
+ import { type OAuthProvider, type OAuthResourceOptions } from "./provider.js";
2
+ /** Verified Better Auth claims exposed to authenticated MCP callbacks. */
3
+ export interface BetterAuthOAuthUser {
4
+ id: string;
5
+ email?: string;
6
+ name?: string;
7
+ picture?: string;
8
+ emailVerified?: boolean;
9
+ sessionId?: string;
10
+ isAnonymous?: boolean;
11
+ roles: string[];
12
+ }
13
+ /** Configures Better Auth JWT verification and protected-resource metadata. */
14
+ export interface BetterAuthOAuthProviderOptions extends OAuthResourceOptions {
15
+ /** Full Better Auth issuer URL, including its base path. */
16
+ authURL: URL | string;
17
+ }
18
+ /**
19
+ * Creates a provider for Better Auth's OAuth 2.1 Provider plugin.
20
+ *
21
+ * Better Auth owns registration, authorization, consent, and token issuance.
22
+ * mcp-use advertises those endpoints and verifies the resulting access-token
23
+ * JWTs against Better Auth's JWKS endpoint.
24
+ *
25
+ * @param options - Better Auth issuer URL and resource-server settings.
26
+ * @returns A provider that rejects tokens not issued for the resolved MCP resource.
27
+ */
28
+ export declare function oauthBetterAuthProvider(options: BetterAuthOAuthProviderOptions): OAuthProvider<BetterAuthOAuthUser>;
29
+ //# sourceMappingURL=better-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/oauth/better-auth.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,0EAA0E;AAC1E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,8BAA+B,SAAQ,oBAAoB;IAC1E,4DAA4D;IAC5D,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,8BAA8B,GACtC,aAAa,CAAC,mBAAmB,CAAC,CAiBpC"}
@@ -0,0 +1,76 @@
1
+ import {
2
+ booleanValue,
3
+ createJwtVerifier,
4
+ invalidToken,
5
+ normalizedProviderUrl,
6
+ normalizedStrings,
7
+ oauthCustomProvider,
8
+ payloadFromAuthInfo,
9
+ providerEndpoint,
10
+ requiredString,
11
+ stringValue
12
+ } from "../chunk-DPL7OEXC.js";
13
+
14
+ // src/oauth/better-auth.ts
15
+ function oauthBetterAuthProvider(options) {
16
+ const issuer = normalizedProviderUrl(
17
+ options.authURL,
18
+ "Better Auth authURL"
19
+ ).href.replace(/\/$/, "");
20
+ return oauthCustomProvider({
21
+ ...options,
22
+ createTokenVerifier: (resource) => createJwtVerifier({
23
+ issuer,
24
+ jwksUrl: new URL(providerEndpoint(issuer, "jwks")),
25
+ resource
26
+ }),
27
+ oauthMetadata: metadata(issuer, options.scopesSupported),
28
+ mapAuthInfo: mapUser
29
+ });
30
+ }
31
+ function metadata(issuer, scopesSupported) {
32
+ return {
33
+ issuer,
34
+ authorization_endpoint: providerEndpoint(issuer, "oauth2/authorize"),
35
+ token_endpoint: providerEndpoint(issuer, "oauth2/token"),
36
+ registration_endpoint: providerEndpoint(issuer, "oauth2/register"),
37
+ jwks_uri: providerEndpoint(issuer, "jwks"),
38
+ response_types_supported: ["code"],
39
+ grant_types_supported: [
40
+ "authorization_code",
41
+ "client_credentials",
42
+ "refresh_token"
43
+ ],
44
+ code_challenge_methods_supported: ["S256"],
45
+ scopes_supported: scopesSupported === void 0 ? ["openid", "profile", "email", "offline_access"] : [...scopesSupported]
46
+ };
47
+ }
48
+ function mapUser(authInfo) {
49
+ const payload = payloadFromAuthInfo(authInfo);
50
+ const id = requiredString(payload, "sub");
51
+ if (id === void 0) throw invalidToken("Missing Better Auth subject");
52
+ return {
53
+ user: {
54
+ id,
55
+ ...optional("email", stringValue(payload, "email")),
56
+ ...optional("name", stringValue(payload, "name")),
57
+ ...optional("picture", stringValue(payload, "picture")),
58
+ ...optional("emailVerified", booleanValue(payload, "email_verified")),
59
+ ...optional("sessionId", stringValue(payload, "sid")),
60
+ ...optional(
61
+ "isAnonymous",
62
+ booleanValue(payload, "is_anonymous") ?? booleanValue(payload, "isAnonymous")
63
+ ),
64
+ roles: normalizedStrings(payload["roles"])
65
+ },
66
+ payload,
67
+ permissions: normalizedStrings(payload["permissions"])
68
+ };
69
+ }
70
+ function optional(key, value) {
71
+ return value === void 0 ? {} : { [key]: value };
72
+ }
73
+ export {
74
+ oauthBetterAuthProvider
75
+ };
76
+ //# sourceMappingURL=better-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/oauth/better-auth.ts"],"sourcesContent":["import type { AuthInfo, OAuthMetadata } from \"@modelcontextprotocol/server\";\n\nimport {\n booleanValue,\n createJwtVerifier,\n invalidToken,\n normalizedStrings,\n normalizedProviderUrl,\n payloadFromAuthInfo,\n providerEndpoint,\n requiredString,\n stringValue,\n} from \"./jwt.js\";\nimport {\n oauthCustomProvider,\n type OAuthProvider,\n type OAuthResourceOptions,\n} from \"./provider.js\";\n\n/** Verified Better Auth claims exposed to authenticated MCP callbacks. */\nexport interface BetterAuthOAuthUser {\n id: string;\n email?: string;\n name?: string;\n picture?: string;\n emailVerified?: boolean;\n sessionId?: string;\n isAnonymous?: boolean;\n roles: string[];\n}\n\n/** Configures Better Auth JWT verification and protected-resource metadata. */\nexport interface BetterAuthOAuthProviderOptions extends OAuthResourceOptions {\n /** Full Better Auth issuer URL, including its base path. */\n authURL: URL | string;\n}\n\n/**\n * Creates a provider for Better Auth's OAuth 2.1 Provider plugin.\n *\n * Better Auth owns registration, authorization, consent, and token issuance.\n * mcp-use advertises those endpoints and verifies the resulting access-token\n * JWTs against Better Auth's JWKS endpoint.\n *\n * @param options - Better Auth issuer URL and resource-server settings.\n * @returns A provider that rejects tokens not issued for the resolved MCP resource.\n */\nexport function oauthBetterAuthProvider(\n options: BetterAuthOAuthProviderOptions\n): OAuthProvider<BetterAuthOAuthUser> {\n const issuer = normalizedProviderUrl(\n options.authURL,\n \"Better Auth authURL\"\n ).href.replace(/\\/$/, \"\");\n\n return oauthCustomProvider<BetterAuthOAuthUser>({\n ...options,\n createTokenVerifier: (resource) =>\n createJwtVerifier({\n issuer,\n jwksUrl: new URL(providerEndpoint(issuer, \"jwks\")),\n resource,\n }),\n oauthMetadata: metadata(issuer, options.scopesSupported),\n mapAuthInfo: mapUser,\n });\n}\n\nfunction metadata(\n issuer: string,\n scopesSupported: readonly string[] | undefined\n): OAuthMetadata {\n return {\n issuer,\n authorization_endpoint: providerEndpoint(issuer, \"oauth2/authorize\"),\n token_endpoint: providerEndpoint(issuer, \"oauth2/token\"),\n registration_endpoint: providerEndpoint(issuer, \"oauth2/register\"),\n jwks_uri: providerEndpoint(issuer, \"jwks\"),\n response_types_supported: [\"code\"],\n grant_types_supported: [\n \"authorization_code\",\n \"client_credentials\",\n \"refresh_token\",\n ],\n code_challenge_methods_supported: [\"S256\"],\n scopes_supported:\n scopesSupported === undefined\n ? [\"openid\", \"profile\", \"email\", \"offline_access\"]\n : [...scopesSupported],\n };\n}\n\nfunction mapUser(authInfo: AuthInfo) {\n const payload = payloadFromAuthInfo(authInfo);\n const id = requiredString(payload, \"sub\");\n if (id === undefined) throw invalidToken(\"Missing Better Auth subject\");\n\n return {\n user: {\n id,\n ...optional(\"email\", stringValue(payload, \"email\")),\n ...optional(\"name\", stringValue(payload, \"name\")),\n ...optional(\"picture\", stringValue(payload, \"picture\")),\n ...optional(\"emailVerified\", booleanValue(payload, \"email_verified\")),\n ...optional(\"sessionId\", stringValue(payload, \"sid\")),\n ...optional(\n \"isAnonymous\",\n booleanValue(payload, \"is_anonymous\") ??\n booleanValue(payload, \"isAnonymous\")\n ),\n roles: normalizedStrings(payload[\"roles\"]),\n },\n payload,\n permissions: normalizedStrings(payload[\"permissions\"]),\n };\n}\n\nfunction optional<T>(key: string, value: T | undefined): Record<string, T> {\n return value === undefined ? {} : { [key]: value };\n}\n"],"mappings":";;;;;;;;;;;;;;AA+CO,SAAS,wBACd,SACoC;AACpC,QAAM,SAAS;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,EACF,EAAE,KAAK,QAAQ,OAAO,EAAE;AAExB,SAAO,oBAAyC;AAAA,IAC9C,GAAG;AAAA,IACH,qBAAqB,CAAC,aACpB,kBAAkB;AAAA,MAChB;AAAA,MACA,SAAS,IAAI,IAAI,iBAAiB,QAAQ,MAAM,CAAC;AAAA,MACjD;AAAA,IACF,CAAC;AAAA,IACH,eAAe,SAAS,QAAQ,QAAQ,eAAe;AAAA,IACvD,aAAa;AAAA,EACf,CAAC;AACH;AAEA,SAAS,SACP,QACA,iBACe;AACf,SAAO;AAAA,IACL;AAAA,IACA,wBAAwB,iBAAiB,QAAQ,kBAAkB;AAAA,IACnE,gBAAgB,iBAAiB,QAAQ,cAAc;AAAA,IACvD,uBAAuB,iBAAiB,QAAQ,iBAAiB;AAAA,IACjE,UAAU,iBAAiB,QAAQ,MAAM;AAAA,IACzC,0BAA0B,CAAC,MAAM;AAAA,IACjC,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kCAAkC,CAAC,MAAM;AAAA,IACzC,kBACE,oBAAoB,SAChB,CAAC,UAAU,WAAW,SAAS,gBAAgB,IAC/C,CAAC,GAAG,eAAe;AAAA,EAC3B;AACF;AAEA,SAAS,QAAQ,UAAoB;AACnC,QAAM,UAAU,oBAAoB,QAAQ;AAC5C,QAAM,KAAK,eAAe,SAAS,KAAK;AACxC,MAAI,OAAO,OAAW,OAAM,aAAa,6BAA6B;AAEtE,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA,GAAG,SAAS,SAAS,YAAY,SAAS,OAAO,CAAC;AAAA,MAClD,GAAG,SAAS,QAAQ,YAAY,SAAS,MAAM,CAAC;AAAA,MAChD,GAAG,SAAS,WAAW,YAAY,SAAS,SAAS,CAAC;AAAA,MACtD,GAAG,SAAS,iBAAiB,aAAa,SAAS,gBAAgB,CAAC;AAAA,MACpE,GAAG,SAAS,aAAa,YAAY,SAAS,KAAK,CAAC;AAAA,MACpD,GAAG;AAAA,QACD;AAAA,QACA,aAAa,SAAS,cAAc,KAClC,aAAa,SAAS,aAAa;AAAA,MACvC;AAAA,MACA,OAAO,kBAAkB,QAAQ,OAAO,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,aAAa,kBAAkB,QAAQ,aAAa,CAAC;AAAA,EACvD;AACF;AAEA,SAAS,SAAY,KAAa,OAAyC;AACzE,SAAO,UAAU,SAAY,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,MAAM;AACnD;","names":[]}
@@ -8,7 +8,8 @@ import {
8
8
  oauthMetadataResponse,
9
9
  requireBearerAuth,
10
10
  verifyBearerToken
11
- } from "../chunk-PMPGMSYA.js";
11
+ } from "../chunk-Z326HADF.js";
12
+ import "../chunk-QUUANIE4.js";
12
13
  import {
13
14
  oauthCustomProvider
14
15
  } from "../chunk-DPL7OEXC.js";
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,cAAc,EAGpB,MAAM,8BAA8B,CAAC;AAItC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAMpE,OAAO,EAUL,KAAK,gBAAgB,EACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAIL,KAAK,0BAA0B,EAE/B,KAAK,kBAAkB,EAGvB,KAAK,kBAAkB,EAExB,MAAM,gCAAgC,CAAC;AAOxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAY7D,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,0BAA0B,EAE3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,eAAe,EACf,YAAY,EACZ,cAAc,EACd,OAAO,EAER,MAAM,YAAY,CAAC;AAGpB,OAAO,EAGL,aAAa,EAUb,KAAK,aAAa,EACnB,MAAM,kBAAkB,CAAC;AAQ1B,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC;AAmD9D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS,CAAC,KAAK,GAAG,KAAK;;IAoClC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,CAOzD;IAED;;;;;;;OAOG;IACH,YAAY,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,EAetC;IAED;;;;;;OAMG;IACH,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;;;;;OAOG;IACH,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,cAAc,EACjC,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,YAAY,CACpB,cAAc,CAAC,CAAC,CAAC,EACjB,eAAe,CAAC,CAAC,CAAC,EAClB,KAAK,EACL,QAAQ,CAAC,KAAK,CAAC,CAChB,GACA,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAelE;IAED;;;;;;;;;;;;OAYG;IACH,CAAC,aAAa,CAAC,CACb,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD,IAAI,CAeN;IAED;;;;;;;;;;OAUG;IACH,YAAY,CACV,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD,IAAI,CAEN;IAED,+DAA+D;IAC/D,QAAQ,CACN,UAAU,EAAE,kBAAkB,EAC9B,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GACjD,IAAI,CAIN;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAC,KAAK,CAAC,CAAC,SAAS,0BAA0B,EACzD,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,wBAAwB,CAChC,mBAAmB,CAAC,CAAC,CAAC,EACtB,KAAK,EACL,QAAQ,CAAC,KAAK,CAAC,CAChB,GACA,IAAI,CAWN;IAED;;;OAGG;IACH,MAAM,CAAC,CAAC,SAAS,gBAAgB,EAC/B,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GACpE,IAAI,CAWN;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,UAAU,CAAC,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,cAAc,CAAA;KAAO,GAAG,gBAAgB,CAGnE;IAED;;;;;;;;;;;;OAYG;IACG,cAAc,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAIlD;IAED;;;;;;;;;;;;;OAaG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EACvB,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,IAAI,CAON;IAED;;;;;;;;;;;;;;OAcG;IACH,EAAE,CAAC,CAAC,SAAS,MAAM,EACjB,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,EACvB,OAAO,EAAE,CAAC,SAAS,GAAG,MAAM,WAAW,GACnC,0BAA0B,GAC1B,kBAAkB,GACrB,IAAI,CASN;IAED;;;;;;;OAOG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;IAED;;;;;;;OAOG;IACG,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;IAED;;;;;;;OAOG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C;IAED;;;;;;;;;OASG;IACG,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtD;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACG,MAAM,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAiEhE;IAED;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAS3B;CAswBF"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/views/document.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAkER"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../src/views/document.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAER;AAgCD;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAkER"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/views/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACtD,YAAY,GAAG,SAAS,CA0C1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACrE,YAAY,GAAG,SAAS,CAmC1B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/views/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMpD;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACtD,YAAY,GAAG,SAAS,CA0C1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAC7C,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GACrE,YAAY,GAAG,SAAS,CAmC1B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAItC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mcp-use",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.6",
4
+ "version": "2.0.0-beta.7",
5
5
  "description": "MCP framework and CLI built on the official v2 SDK",
6
6
  "author": "mcp-use, Inc.",
7
7
  "license": "MIT",
@@ -29,6 +29,10 @@
29
29
  "types": "./dist/react/index.d.ts",
30
30
  "import": "./dist/react/index.js"
31
31
  },
32
+ "./landing": {
33
+ "types": "./dist/landing.d.ts",
34
+ "import": "./dist/landing.js"
35
+ },
32
36
  "./oauth": {
33
37
  "types": "./dist/oauth/index.d.ts",
34
38
  "import": "./dist/oauth/index.js"
@@ -53,6 +57,10 @@
53
57
  "types": "./dist/oauth/keycloak.d.ts",
54
58
  "import": "./dist/oauth/keycloak.js"
55
59
  },
60
+ "./oauth/better-auth": {
61
+ "types": "./dist/oauth/better-auth.d.ts",
62
+ "import": "./dist/oauth/better-auth.js"
63
+ },
56
64
  "./node": {
57
65
  "types": "./dist/node-bridge.d.ts",
58
66
  "import": "./dist/node-bridge.js"
@@ -111,7 +119,7 @@
111
119
  "vitest": "^4.1.9",
112
120
  "zod": "^4.4.3",
113
121
  "@mcp-use/client": "2.0.0-beta.1",
114
- "mcp-use": "2.0.0-beta.6"
122
+ "mcp-use": "2.0.0-beta.7"
115
123
  },
116
124
  "publishConfig": {
117
125
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/oauth/index.ts","../src/oauth/adapters.ts","../src/fetch-app.ts"],"sourcesContent":["/**\n * OAuth resource-server helpers and provider configuration for mcp-use.\n *\n * @packageDocumentation\n */\nexport {\n OAuthError,\n OAuthErrorCode,\n bearerAuthChallengeResponse,\n getOAuthProtectedResourceMetadataUrl,\n oauthMetadataResponse,\n requireBearerAuth,\n verifyBearerToken,\n} from \"@modelcontextprotocol/server\";\nexport type {\n AuthInfo as OAuthAuthInfo,\n AuthMetadataOptions,\n BearerAuthOptions,\n OAuthMetadata,\n OAuthProtectedResourceMetadata,\n OAuthTokenVerifier,\n} from \"@modelcontextprotocol/server\";\n\nexport { bearerAuth, oauthMetadata } from \"./adapters.js\";\nexport {\n oauthCustomProvider,\n type CustomOAuthProviderOptions,\n type OAuthExtra,\n type OAuthProvider,\n type OAuthResourceOptions,\n} from \"./provider.js\";\n","import {\n getOAuthProtectedResourceMetadataUrl,\n oauthMetadataResponse,\n requireBearerAuth,\n type AuthInfo,\n} from \"@modelcontextprotocol/server\";\n\nimport { getRequestBag, type FetchMiddleware } from \"../fetch-app.js\";\nimport { getOAuthProviderOptions, wrapOAuthTokenVerifier } from \"./internal.js\";\nimport type { OAuthProvider } from \"./provider.js\";\n\n/**\n * Fetch middleware that requires a bearer token for a canonical resource.\n *\n * @typeParam TUser - Application user type carried by the provider.\n * @param provider - OAuth provider that verifies the bearer token.\n * @param resource - Canonical public MCP endpoint URL.\n */\nexport function bearerAuth<TUser>(\n provider: OAuthProvider<TUser>,\n resource: URL\n): FetchMiddleware {\n const options = getOAuthProviderOptions(provider);\n const gate = requireBearerAuth({\n verifier: wrapOAuthTokenVerifier(provider, resource),\n resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(resource),\n ...(options.requiredScopes !== undefined && {\n requiredScopes: [...options.requiredScopes],\n }),\n });\n\n return async (request, next) => {\n const result = await gate(request);\n if (result instanceof Response) {\n return result;\n }\n getRequestBag(request).authInfo = result;\n return next();\n };\n}\n\n/**\n * Fetch middleware that serves OAuth discovery metadata.\n *\n * @typeParam TUser - Application user type carried by the provider.\n * @param provider - OAuth provider that supplies authorization-server metadata.\n * @param resource - Canonical public MCP endpoint URL.\n */\nexport function oauthMetadata<TUser>(\n provider: OAuthProvider<TUser>,\n resource: URL\n): FetchMiddleware {\n const options = getOAuthProviderOptions(provider);\n return async (request, next) => {\n const response = oauthMetadataResponse(request, {\n oauthMetadata: options.oauthMetadata,\n resourceServerUrl: resource,\n ...(options.scopesSupported !== undefined && {\n scopesSupported: [...options.scopesSupported],\n }),\n ...(options.resourceName !== undefined && {\n resourceName: options.resourceName,\n }),\n ...(options.serviceDocumentationUrl !== undefined && {\n serviceDocumentationUrl: options.serviceDocumentationUrl,\n }),\n });\n if (response !== undefined) {\n return response;\n }\n return next();\n };\n}\n/**\n * Read verified {@link AuthInfo} from the request bag after {@link bearerAuth}.\n *\n * @param request - Request that passed through bearer auth middleware.\n */\nexport function authInfoFromRequest(request: Request): AuthInfo | undefined {\n return getRequestBag(request).authInfo;\n}\n","import {\n hostHeaderValidationResponse,\n originValidationResponse,\n type AuthInfo,\n} from \"@modelcontextprotocol/server\";\n\n/** Web-standard request handler. */\nexport type FetchHandler = (request: Request) => Promise<Response>;\n\n/** Request shapes accepted by {@link toFrameworkHandler}. */\nexport type FrameworkRequestLike = Request | { req: { raw: Request } };\n\n/**\n * Universal web handler mountable in Vercel, Hono, TanStack, and other\n * fetch-native frameworks without `c.req.raw` boilerplate.\n */\nexport type FrameworkHandler = (\n input: FrameworkRequestLike\n) => Promise<Response>;\n\n/**\n * Wrap a {@link FetchHandler} for framework duck-typing (Hono `Context`, etc.).\n *\n * @param fetch - Inner fetch handler produced by {@link MCPServer.getHandler}.\n */\nexport function toFrameworkHandler(fetch: FetchHandler): FrameworkHandler {\n return (input) => {\n const request = input instanceof Request ? input : input.req.raw;\n return fetch(request);\n };\n}\n\n/** Onion middleware over a {@link FetchHandler} terminal. */\nexport type FetchMiddleware = (\n request: Request,\n next: () => Promise<Response>\n) => Promise<Response>;\n\n/** Per-request values stashed before the MCP handler runs. */\nexport interface RequestBag {\n /** Parsed JSON body when the JSON middleware ran first. */\n parsedBody?: unknown;\n /** Verified OAuth identity forwarded to the SDK handler. */\n authInfo?: AuthInfo;\n}\n\nconst requestBags = new WeakMap<Request, RequestBag>();\n\n/**\n * Mutable per-request bag; created on first access.\n *\n * @param request - Incoming request whose bag to read or create.\n */\nexport function getRequestBag(request: Request): RequestBag {\n let bag = requestBags.get(request);\n if (bag === undefined) {\n bag = {};\n requestBags.set(request, bag);\n }\n return bag;\n}\n\n/**\n * Compose middleware around a terminal handler (first listed runs outermost).\n *\n * @param terminal - Fallback handler when no middleware short-circuits.\n * @param middlewares - Middleware chain executed before `terminal`.\n */\nexport function composeFetch(\n terminal: FetchHandler,\n ...middlewares: FetchMiddleware[]\n): FetchHandler {\n return async (request: Request): Promise<Response> => {\n let index = 0;\n const dispatch = async (): Promise<Response> => {\n if (index < middlewares.length) {\n const middleware = middlewares[index]!;\n index += 1;\n return middleware(request, dispatch);\n }\n return terminal(request);\n };\n return dispatch();\n };\n}\n\n/**\n * Return the pathname of a request URL.\n *\n * @param request - Request whose pathname to read.\n */\nexport function pathnameOf(request: Request): string {\n return new URL(request.url).pathname;\n}\n\n/**\n * Match a request pathname exactly.\n *\n * @param request - Request to test.\n * @param path - Exact pathname (for example `/mcp`).\n */\nexport function matchesPath(request: Request, path: string): boolean {\n return pathnameOf(request) === path;\n}\n\n/**\n * Match a request pathname prefix (prefix or `prefix/...`).\n *\n * @param request - Request to test.\n * @param prefix - Path prefix without a trailing wildcard.\n */\nexport function matchesPathPrefix(request: Request, prefix: string): boolean {\n const pathname = pathnameOf(request);\n return pathname === prefix || pathname.startsWith(`${prefix}/`);\n}\n\n/**\n * Dispatch to the first matching route handler.\n *\n * @param routes - Ordered route table; first match wins.\n * @param fallback - Handler when nothing matches.\n */\nexport function routeFetch(\n routes: Array<{\n match: (request: Request) => boolean;\n handler: FetchHandler;\n }>,\n fallback: FetchHandler = async () =>\n new Response(\"Not Found\", { status: 404 })\n): FetchHandler {\n return async (request: Request): Promise<Response> => {\n for (const route of routes) {\n if (route.match(request)) {\n return route.handler(request);\n }\n }\n return fallback(request);\n };\n}\n\n/**\n * Parse JSON bodies once and stash them in the request bag.\n */\nexport function jsonBodyMiddleware(): FetchMiddleware {\n return async (request, next) => {\n const bag = getRequestBag(request);\n if (bag.parsedBody !== undefined) {\n return next();\n }\n if (\n !(request.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")\n ) {\n return next();\n }\n try {\n bag.parsedBody = await request.clone().json();\n } catch {\n return new Response(\"Invalid JSON\", { status: 400 });\n }\n return next();\n };\n}\n\n/**\n * Reject requests whose `Host` header is not on the allowlist.\n *\n * @param hosts - Allowed hostnames (port-agnostic).\n */\nexport function hostValidationMiddleware(hosts: string[]): FetchMiddleware {\n return async (request, next) => {\n const rejected = hostHeaderValidationResponse(request, hosts);\n return rejected ?? next();\n };\n}\n\n/**\n * Reject requests whose `Origin` header is not on the allowlist.\n *\n * @param origins - Allowed origin hostnames (port-agnostic).\n * @param skipSafeMethods - When true, skip GET/HEAD (view asset GETs).\n */\nexport function originValidationMiddleware(\n origins: string[],\n skipSafeMethods = true\n): FetchMiddleware {\n return async (request, next) => {\n if (\n skipSafeMethods &&\n (request.method === \"GET\" || request.method === \"HEAD\")\n ) {\n return next();\n }\n const rejected = originValidationResponse(request, origins);\n return rejected ?? next();\n };\n}\n"],"mappings":"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","names":["getOAuthProtectedResourceMetadataUrl","oauthMetadataResponse","requireBearerAuth"]}
@@ -1,187 +0,0 @@
1
- // src/views/document.ts
2
- function resolveAssetUrl(assetPath, origin) {
3
- if (!assetPath.startsWith("/")) {
4
- throw new Error(
5
- `View manifest asset path must be origin-absolute (start with "/"); got ${JSON.stringify(assetPath)}`
6
- );
7
- }
8
- return `${origin}${assetPath}`;
9
- }
10
- function viewAssetsBasePath(basePath, viewName) {
11
- return `${basePath}/_mcp-use/views/${viewName}/`;
12
- }
13
- function resolveExternalAssetUrl(assetPath, assetsBase, basePath, viewName) {
14
- if (assetPath.startsWith("http://") || assetPath.startsWith("https://") || assetPath.startsWith("data:")) {
15
- return assetPath;
16
- }
17
- if (assetPath.startsWith("/")) {
18
- return resolveAssetUrl(assetPath, assetsBase);
19
- }
20
- return `${assetsBase}${viewAssetsBasePath(basePath, viewName)}${assetPath.replace(/^\/+/, "")}`;
21
- }
22
- function resolvePublicBase(assetsBase, basePath) {
23
- return `${assetsBase}${basePath}/_mcp-use/public/`;
24
- }
25
- function escapeInlineScript(code) {
26
- return code.replaceAll(/<\/script/gi, "<\\/script").replaceAll("<!--", "\\x3C!--");
27
- }
28
- function escapeInlineStyle(css) {
29
- return css.replaceAll(/<\/style/gi, "<\\/style");
30
- }
31
- function escapeHtml(value) {
32
- return value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
33
- }
34
- function synthesizeViewDocument(entry, assetsBase, basePath, viewName) {
35
- const viewConfig = {
36
- publicBase: resolvePublicBase(assetsBase, basePath)
37
- };
38
- const configScript = `<script>globalThis.__mcpUseViewConfig=${JSON.stringify(viewConfig)};</script>`;
39
- if (entry.kind === "inline") {
40
- const styleTag = entry.css.length > 0 ? `<style>${escapeInlineStyle(entry.css)}</style>` : "";
41
- const moduleScript = `<script type="module">${escapeInlineScript(entry.js)}</script>`;
42
- return `<!doctype html>
43
- <html>
44
- <head>
45
- <meta charset="utf-8">
46
- ${configScript}
47
- ${styleTag}
48
- </head>
49
- <body>
50
- <div id="root"></div>
51
- ${moduleScript}
52
- </body>
53
- </html>`;
54
- }
55
- if (viewName === void 0) {
56
- throw new Error(
57
- "viewName is required when synthesizing an external view document."
58
- );
59
- }
60
- const cssLinks = entry.css.map(
61
- (path) => `<link rel="stylesheet" href="${escapeHtml(resolveExternalAssetUrl(path, assetsBase, basePath, viewName))}">`
62
- ).join("\n");
63
- const scriptTags = (entry.scripts ?? []).map(
64
- (path) => `<script type="module" src="${escapeHtml(resolveExternalAssetUrl(path, assetsBase, basePath, viewName))}"></script>`
65
- ).join("\n");
66
- const entryUrl = resolveExternalAssetUrl(
67
- entry.entry,
68
- assetsBase,
69
- basePath,
70
- viewName
71
- );
72
- return `<!doctype html>
73
- <html>
74
- <head>
75
- <meta charset="utf-8">
76
- ${configScript}
77
- ${cssLinks}
78
- </head>
79
- <body>
80
- <div id="root"></div>
81
- ${scriptTags}
82
- <script type="module" src="${escapeHtml(entryUrl)}"></script>
83
- </body>
84
- </html>`;
85
- }
86
-
87
- // src/views/origin.ts
88
- function stripTrailingSlashes(value) {
89
- return value.replace(/\/+$/, "");
90
- }
91
- function readEnv(name) {
92
- if (typeof process === "undefined") {
93
- return void 0;
94
- }
95
- const value = process.env[name];
96
- return value !== void 0 && value !== "" ? value : void 0;
97
- }
98
- function parseForwardedHeader(header) {
99
- for (const part of header.split(",")) {
100
- const params = /* @__PURE__ */ new Map();
101
- for (const token of part.split(";")) {
102
- const [key, ...rest] = token.trim().split("=");
103
- if (key === void 0 || rest.length === 0) {
104
- continue;
105
- }
106
- params.set(key.toLowerCase(), rest.join("=").replace(/^"|"$/g, ""));
107
- }
108
- const proto = params.get("proto");
109
- const host = params.get("host");
110
- if (proto !== void 0 && host !== void 0) {
111
- return `${proto}://${host}`;
112
- }
113
- }
114
- return void 0;
115
- }
116
- function resolveRequestOriginFromHeaders(request) {
117
- const forwarded = request.headers.get("forwarded");
118
- if (forwarded !== null) {
119
- const fromForwarded = parseForwardedHeader(forwarded);
120
- if (fromForwarded !== void 0) {
121
- return fromForwarded;
122
- }
123
- }
124
- const proto = request.headers.get("x-forwarded-proto");
125
- const host = request.headers.get("x-forwarded-host");
126
- if (proto !== null && host !== null) {
127
- const firstHost = host.split(",")[0]?.trim();
128
- const firstProto = proto.split(",")[0]?.trim();
129
- if (firstHost !== void 0 && firstProto !== void 0 && firstHost !== "") {
130
- return `${firstProto}://${firstHost}`;
131
- }
132
- }
133
- return new URL(request.url).origin;
134
- }
135
- function resolveServerOrigin(request) {
136
- const mcpUrl = readEnv("MCP_URL");
137
- if (mcpUrl !== void 0) {
138
- try {
139
- return new URL(mcpUrl).origin;
140
- } catch {
141
- }
142
- }
143
- return resolveRequestOriginFromHeaders(request);
144
- }
145
- function originFromAssetsBase(assetsBase) {
146
- try {
147
- return new URL(assetsBase).origin;
148
- } catch {
149
- return assetsBase;
150
- }
151
- }
152
- function normalizeAssetsBaseUrl(value) {
153
- return stripTrailingSlashes(value);
154
- }
155
- function resolveAssetsBase(request) {
156
- const assetsUrl = readEnv("MCP_ASSETS_URL");
157
- if (assetsUrl !== void 0) {
158
- try {
159
- return normalizeAssetsBaseUrl(new URL(assetsUrl).href.replace(/\/$/, ""));
160
- } catch {
161
- }
162
- }
163
- return resolveServerOrigin(request);
164
- }
165
- function hasExplicitAssetsBase() {
166
- const assetsUrl = readEnv("MCP_ASSETS_URL");
167
- if (assetsUrl === void 0) {
168
- return false;
169
- }
170
- try {
171
- new URL(assetsUrl);
172
- return true;
173
- } catch {
174
- return false;
175
- }
176
- }
177
-
178
- export {
179
- viewAssetsBasePath,
180
- synthesizeViewDocument,
181
- resolveServerOrigin,
182
- originFromAssetsBase,
183
- normalizeAssetsBaseUrl,
184
- resolveAssetsBase,
185
- hasExplicitAssetsBase
186
- };
187
- //# sourceMappingURL=chunk-VV2P4ZFZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/views/document.ts","../src/views/origin.ts"],"sourcesContent":["import type { McpUseViewConfig } from \"../react/public-assets.js\";\nimport type { ViewManifestEntry } from \"./types.js\";\n\n/**\n * Resolve a manifest asset path to an absolute URL for embedding in the\n * synthesized view document.\n *\n * External manifest entries are origin-absolute `/`-prefixed paths by\n * contract ({@link ExternalViewManifestEntry}).\n *\n * @param assetPath - Origin-absolute path starting with `/`.\n * @param origin - Request-resolved public origin.\n * @returns Absolute URL `${origin}${assetPath}`.\n * @throws When `assetPath` does not start with `/`.\n */\nexport function resolveAssetUrl(assetPath: string, origin: string): string {\n if (!assetPath.startsWith(\"/\")) {\n throw new Error(\n `View manifest asset path must be origin-absolute (start with \"/\"); got ${JSON.stringify(assetPath)}`\n );\n }\n return `${origin}${assetPath}`;\n}\n\n/**\n * Build the HTTP path prefix for a view's built assets (no origin).\n *\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param viewName - View directory / manifest key.\n */\nexport function viewAssetsBasePath(basePath: string, viewName: string): string {\n return `${basePath}/_mcp-use/views/${viewName}/`;\n}\n\n/**\n * Resolve a production or dev external asset path to an absolute URL.\n *\n * @param assetPath - Full CDN URL, origin-absolute dev path (`/…`), or\n * view-relative production path (`assets/…`).\n * @param assetsBase - Assets URL prefix (origin + optional path).\n * @param basePath - MCP mount prefix.\n * @param viewName - View directory / manifest key (required for view-relative paths).\n */\nexport function resolveExternalAssetUrl(\n assetPath: string,\n assetsBase: string,\n basePath: string,\n viewName: string\n): string {\n if (\n assetPath.startsWith(\"http://\") ||\n assetPath.startsWith(\"https://\") ||\n assetPath.startsWith(\"data:\")\n ) {\n return assetPath;\n }\n if (assetPath.startsWith(\"/\")) {\n return resolveAssetUrl(assetPath, assetsBase);\n }\n return `${assetsBase}${viewAssetsBasePath(basePath, viewName)}${assetPath.replace(/^\\/+/, \"\")}`;\n}\n\n/**\n * Resolve the absolute URL prefix for the project's `public/` directory.\n *\n * @param assetsBase - Assets URL prefix (origin + optional path).\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @returns Absolute prefix with trailing slash.\n */\nexport function resolvePublicBase(\n assetsBase: string,\n basePath: string\n): string {\n return `${assetsBase}${basePath}/_mcp-use/public/`;\n}\n\n/**\n * Escape view JS so it can sit inside a HTML `<script>` element without\n * premature termination or comment-open sequences.\n *\n * @param code - Raw module source.\n */\nfunction escapeInlineScript(code: string): string {\n return code\n .replaceAll(/<\\/script/gi, \"<\\\\/script\")\n .replaceAll(\"<!--\", \"\\\\x3C!--\");\n}\n\n/**\n * Escape CSS so it can sit inside a HTML `<style>` element without premature\n * termination.\n *\n * @param css - Raw stylesheet text.\n */\nfunction escapeInlineStyle(css: string): string {\n return css.replaceAll(/<\\/style/gi, \"<\\\\/style\");\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\n/**\n * Synthesize a complete HTML document for a view from manifest data.\n *\n * Production (`kind: \"external\"`) loads built assets over HTTP with absolute\n * URLs. Legacy `kind: \"inline\"` embeds JS/CSS directly. Dev uses Vite module\n * URLs (`kind: \"external\"` with origin-absolute paths).\n *\n * @param entry - Primed manifest entry for the view.\n * @param assetsBase - Request-resolved assets URL prefix for absolute asset URLs.\n * @param basePath - MCP mount prefix (e.g. `/mcp`).\n * @param viewName - View directory / manifest key (required for production external paths).\n */\nexport function synthesizeViewDocument(\n entry: ViewManifestEntry,\n assetsBase: string,\n basePath: string,\n viewName?: string\n): string {\n const viewConfig: McpUseViewConfig = {\n publicBase: resolvePublicBase(assetsBase, basePath),\n };\n const configScript = `<script>globalThis.__mcpUseViewConfig=${JSON.stringify(viewConfig)};</script>`;\n\n if (entry.kind === \"inline\") {\n const styleTag =\n entry.css.length > 0\n ? `<style>${escapeInlineStyle(entry.css)}</style>`\n : \"\";\n const moduleScript = `<script type=\"module\">${escapeInlineScript(entry.js)}</script>`;\n return `<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n${configScript}\n${styleTag}\n</head>\n<body>\n<div id=\"root\"></div>\n${moduleScript}\n</body>\n</html>`;\n }\n\n if (viewName === undefined) {\n throw new Error(\n \"viewName is required when synthesizing an external view document.\"\n );\n }\n\n const cssLinks = entry.css\n .map(\n (path) =>\n `<link rel=\"stylesheet\" href=\"${escapeHtml(resolveExternalAssetUrl(path, assetsBase, basePath, viewName))}\">`\n )\n .join(\"\\n\");\n\n const scriptTags = (entry.scripts ?? [])\n .map(\n (path) =>\n `<script type=\"module\" src=\"${escapeHtml(resolveExternalAssetUrl(path, assetsBase, basePath, viewName))}\"></script>`\n )\n .join(\"\\n\");\n\n const entryUrl = resolveExternalAssetUrl(\n entry.entry,\n assetsBase,\n basePath,\n viewName\n );\n\n return `<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n${configScript}\n${cssLinks}\n</head>\n<body>\n<div id=\"root\"></div>\n${scriptTags}\n<script type=\"module\" src=\"${escapeHtml(entryUrl)}\"></script>\n</body>\n</html>`;\n}\n","/**\n * Resolve public origins and asset URL prefixes for view documents and CSP.\n *\n * **Server origin** (`resolveServerOrigin`): MCP endpoint / API base — OAuth\n * resource identity, `connectDomains`, dev HMR websocket host.\n *\n * **Assets base** (`resolveAssetsBase`): prefix for view JS/CSS and\n * `public/` URLs — may include a path (CDN bucket prefix).\n */\n\n/** Strip trailing slashes from a URL prefix. */\nexport function stripTrailingSlashes(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction readEnv(name: string): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const value = process.env[name];\n return value !== undefined && value !== \"\" ? value : undefined;\n}\n\nfunction parseForwardedHeader(header: string): string | undefined {\n for (const part of header.split(\",\")) {\n const params = new Map<string, string>();\n for (const token of part.split(\";\")) {\n const [key, ...rest] = token.trim().split(\"=\");\n if (key === undefined || rest.length === 0) {\n continue;\n }\n params.set(key.toLowerCase(), rest.join(\"=\").replace(/^\"|\"$/g, \"\"));\n }\n const proto = params.get(\"proto\");\n const host = params.get(\"host\");\n if (proto !== undefined && host !== undefined) {\n return `${proto}://${host}`;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve origin from forwarded headers or the request URL (no env override).\n */\nexport function resolveRequestOriginFromHeaders(request: Request): string {\n const forwarded = request.headers.get(\"forwarded\");\n if (forwarded !== null) {\n const fromForwarded = parseForwardedHeader(forwarded);\n if (fromForwarded !== undefined) {\n return fromForwarded;\n }\n }\n\n const proto = request.headers.get(\"x-forwarded-proto\");\n const host = request.headers.get(\"x-forwarded-host\");\n if (proto !== null && host !== null) {\n const firstHost = host.split(\",\")[0]?.trim();\n const firstProto = proto.split(\",\")[0]?.trim();\n if (\n firstHost !== undefined &&\n firstProto !== undefined &&\n firstHost !== \"\"\n ) {\n return `${firstProto}://${firstHost}`;\n }\n }\n\n return new URL(request.url).origin;\n}\n\n/**\n * Server public origin — `MCP_URL` when valid, else forwarded/request origin.\n *\n * Uses `.origin` only (path suffix on `MCP_URL` is ignored).\n */\nexport function resolveServerOrigin(request: Request): string {\n const mcpUrl = readEnv(\"MCP_URL\");\n if (mcpUrl !== undefined) {\n try {\n return new URL(mcpUrl).origin;\n } catch {\n // Fall through when MCP_URL is malformed.\n }\n }\n return resolveRequestOriginFromHeaders(request);\n}\n\n/**\n * Extract the origin from an assets URL prefix (origin + optional path).\n */\nexport function originFromAssetsBase(assetsBase: string): string {\n try {\n return new URL(assetsBase).origin;\n } catch {\n return assetsBase;\n }\n}\n\n/**\n * Normalize `MCP_ASSETS_URL` to a URL prefix without trailing slash.\n */\nexport function normalizeAssetsBaseUrl(value: string): string {\n return stripTrailingSlashes(value);\n}\n\n/**\n * Assets URL prefix for view JS/CSS and `public/` — `MCP_ASSETS_URL` when set,\n * else server origin from {@link resolveServerOrigin}.\n */\nexport function resolveAssetsBase(request: Request): string {\n const assetsUrl = readEnv(\"MCP_ASSETS_URL\");\n if (assetsUrl !== undefined) {\n try {\n return normalizeAssetsBaseUrl(new URL(assetsUrl).href.replace(/\\/$/, \"\"));\n } catch {\n // Fall through when MCP_ASSETS_URL is malformed.\n }\n }\n return resolveServerOrigin(request);\n}\n\n/**\n * @deprecated Alias for {@link resolveServerOrigin} — kept for OAuth callers.\n */\nexport function resolveRequestOrigin(request: Request): string {\n return resolveServerOrigin(request);\n}\n\n/**\n * Whether `MCP_ASSETS_URL` is explicitly configured (distinct from server).\n */\nexport function hasExplicitAssetsBase(): boolean {\n const assetsUrl = readEnv(\"MCP_ASSETS_URL\");\n if (assetsUrl === undefined) {\n return false;\n }\n try {\n new URL(assetsUrl);\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":[]}