mcp-use 2.0.0-beta.35 → 2.0.0-beta.36

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.
@@ -1,93 +1 @@
1
- import {
2
- booleanValue,
3
- createJwtVerifier,
4
- invalidToken,
5
- isRecord,
6
- normalizedProviderUrl,
7
- normalizedStrings,
8
- oauthCustomProvider,
9
- payloadFromAuthInfo,
10
- providerEndpoint,
11
- recordValue,
12
- requiredString,
13
- stringValue
14
- } from "../chunk-YF5X7FYF.js";
15
-
16
- // src/oauth/keycloak.ts
17
- function oauthKeycloakProvider(options) {
18
- if (typeof options.realm !== "string" || options.realm.trim().length === 0 || /[/?#]/.test(options.realm)) {
19
- throw new TypeError("Keycloak realm is invalid");
20
- }
21
- const serverUrl = normalizedProviderUrl(
22
- options.serverUrl,
23
- "Keycloak serverUrl"
24
- );
25
- const issuer = providerEndpoint(
26
- serverUrl,
27
- `realms/${encodeURIComponent(options.realm)}`
28
- ).replace(/\/$/, "");
29
- return oauthCustomProvider({
30
- ...options,
31
- createTokenVerifier: (resource) => createJwtVerifier({
32
- issuer,
33
- jwksUrl: new URL(
34
- providerEndpoint(issuer, "protocol/openid-connect/certs")
35
- ),
36
- resource
37
- }),
38
- oauthMetadata: {
39
- issuer,
40
- authorization_endpoint: providerEndpoint(
41
- issuer,
42
- "protocol/openid-connect/auth"
43
- ),
44
- token_endpoint: providerEndpoint(issuer, "protocol/openid-connect/token"),
45
- registration_endpoint: providerEndpoint(
46
- issuer,
47
- "clients-registrations/openid-connect"
48
- ),
49
- response_types_supported: ["code"],
50
- grant_types_supported: ["authorization_code", "refresh_token"],
51
- code_challenge_methods_supported: ["S256"]
52
- },
53
- mapAuthInfo: mapUser
54
- });
55
- }
56
- function mapUser(authInfo) {
57
- const payload = payloadFromAuthInfo(authInfo);
58
- const id = requiredString(payload, "sub");
59
- if (id === void 0) throw invalidToken("Missing Keycloak subject");
60
- const realmAccess = recordValue(payload, "realm_access");
61
- const resourceAccess = recordValue(payload, "resource_access");
62
- return {
63
- user: {
64
- id,
65
- ...optional("email", stringValue(payload, "email")),
66
- ...optional("name", stringValue(payload, "name")),
67
- ...optional(
68
- "preferredUsername",
69
- stringValue(payload, "preferred_username")
70
- ),
71
- ...optional("givenName", stringValue(payload, "given_name")),
72
- ...optional("familyName", stringValue(payload, "family_name")),
73
- ...optional("emailVerified", booleanValue(payload, "email_verified")),
74
- roles: realmAccess === void 0 ? [] : normalizedStrings(realmAccess["roles"]),
75
- ...realmAccess !== void 0 && { realmAccess },
76
- ...resourceAccess !== void 0 && { resourceAccess }
77
- },
78
- payload,
79
- permissions: resourcePermissions(resourceAccess)
80
- };
81
- }
82
- function optional(key, value) {
83
- return value === void 0 ? {} : { [key]: value };
84
- }
85
- function resourcePermissions(resourceAccess) {
86
- if (resourceAccess === void 0) return [];
87
- return Object.entries(resourceAccess).flatMap(
88
- ([resource, value]) => isRecord(value) ? normalizedStrings(value["roles"]).map((role) => `${resource}:${role}`) : []
89
- );
90
- }
91
- export {
92
- oauthKeycloakProvider
93
- };
1
+ import{booleanValue,createJwtVerifier,invalidToken,isRecord,normalizedProviderUrl,normalizedStrings,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,recordValue,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthKeycloakProvider(options){if(typeof options.realm!="string"||options.realm.trim().length===0||/[/?#]/.test(options.realm))throw new TypeError("Keycloak realm is invalid");let serverUrl=normalizedProviderUrl(options.serverUrl,"Keycloak serverUrl"),issuer=providerEndpoint(serverUrl,`realms/${encodeURIComponent(options.realm)}`).replace(/\/$/,"");return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(issuer,"protocol/openid-connect/certs")),resource}),oauthMetadata:{issuer,authorization_endpoint:providerEndpoint(issuer,"protocol/openid-connect/auth"),token_endpoint:providerEndpoint(issuer,"protocol/openid-connect/token"),registration_endpoint:providerEndpoint(issuer,"clients-registrations/openid-connect"),response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token"],code_challenge_methods_supported:["S256"]},mapAuthInfo:mapUser})}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub");if(id===void 0)throw invalidToken("Missing Keycloak subject");let realmAccess=recordValue(payload,"realm_access"),resourceAccess=recordValue(payload,"resource_access");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("name",stringValue(payload,"name")),...optional("preferredUsername",stringValue(payload,"preferred_username")),...optional("givenName",stringValue(payload,"given_name")),...optional("familyName",stringValue(payload,"family_name")),...optional("emailVerified",booleanValue(payload,"email_verified")),roles:realmAccess===void 0?[]:normalizedStrings(realmAccess.roles),...realmAccess!==void 0&&{realmAccess},...resourceAccess!==void 0&&{resourceAccess}},payload,permissions:resourcePermissions(resourceAccess)}}function optional(key,value){return value===void 0?{}:{[key]:value}}function resourcePermissions(resourceAccess){return resourceAccess===void 0?[]:Object.entries(resourceAccess).flatMap(([resource,value])=>isRecord(value)?normalizedStrings(value.roles).map(role=>`${resource}:${role}`):[])}export{oauthKeycloakProvider};
@@ -1,100 +1 @@
1
- import {
2
- createJwtVerifier,
3
- invalidToken,
4
- isRecord,
5
- normalizedProviderUrl,
6
- oauthCustomProvider,
7
- payloadFromAuthInfo,
8
- providerEndpoint,
9
- recordValue,
10
- requiredString,
11
- stringValue
12
- } from "../chunk-YF5X7FYF.js";
13
-
14
- // src/oauth/supabase.ts
15
- function oauthSupabaseProvider(options) {
16
- const supabaseUrl = resolveSupabaseUrl(options);
17
- const issuer = providerEndpoint(supabaseUrl, "auth/v1").replace(/\/$/, "");
18
- const secret = options.jwtSecret;
19
- if (secret !== void 0 && new TextEncoder().encode(secret).length < 32) {
20
- throw new TypeError("Supabase jwtSecret must be at least 32 bytes");
21
- }
22
- return oauthCustomProvider({
23
- ...options,
24
- createTokenVerifier: (resource) => createJwtVerifier({
25
- issuer,
26
- jwksUrl: new URL(
27
- providerEndpoint(supabaseUrl, "auth/v1/.well-known/jwks.json")
28
- ),
29
- ...secret !== void 0 ? { key: new TextEncoder().encode(secret), algorithms: ["HS256"] } : { algorithms: ["ES256"] },
30
- resource
31
- }),
32
- oauthMetadata: {
33
- issuer,
34
- authorization_endpoint: providerEndpoint(
35
- supabaseUrl,
36
- "auth/v1/oauth/authorize"
37
- ),
38
- token_endpoint: providerEndpoint(supabaseUrl, "auth/v1/oauth/token"),
39
- registration_endpoint: providerEndpoint(
40
- supabaseUrl,
41
- "auth/v1/oauth/clients/register"
42
- ),
43
- response_types_supported: ["code"],
44
- grant_types_supported: ["authorization_code", "refresh_token"],
45
- code_challenge_methods_supported: ["S256"]
46
- },
47
- mapAuthInfo: mapUser
48
- });
49
- }
50
- function mapUser(authInfo) {
51
- const payload = payloadFromAuthInfo(authInfo);
52
- const id = requiredString(payload, "sub") ?? requiredString(payload, "user_id");
53
- if (id === void 0) throw invalidToken("Missing Supabase subject");
54
- const userMetadata = recordValue(payload, "user_metadata") ?? {};
55
- const aal = stringValue(payload, "aal");
56
- return {
57
- user: {
58
- id,
59
- ...optional("email", stringValue(payload, "email")),
60
- ...optional("name", stringValue(userMetadata, "name")),
61
- ...optional("fullName", stringValue(userMetadata, "full_name")),
62
- ...optional("username", stringValue(userMetadata, "username")),
63
- ...optional("avatarUrl", stringValue(userMetadata, "avatar_url")),
64
- ...optional("role", stringValue(payload, "role")),
65
- ...optional("aal", aal),
66
- amr: supabaseAmr(payload["amr"]),
67
- ...optional("sessionId", stringValue(payload, "session_id"))
68
- },
69
- payload,
70
- permissions: aal === void 0 ? [] : [`aal:${aal}`]
71
- };
72
- }
73
- function optional(key, value) {
74
- return value === void 0 ? {} : { [key]: value };
75
- }
76
- function resolveSupabaseUrl(options) {
77
- if (options.supabaseUrl !== void 0) {
78
- return normalizedProviderUrl(options.supabaseUrl, "supabaseUrl");
79
- }
80
- if (options.projectId === void 0 || !/^[a-z0-9-]+$/i.test(options.projectId)) {
81
- throw new TypeError("Supabase requires projectId or supabaseUrl");
82
- }
83
- return new URL(`https://${options.projectId}.supabase.co`);
84
- }
85
- function supabaseAmr(value) {
86
- if (!Array.isArray(value)) return [];
87
- return value.flatMap((item) => {
88
- if (!isRecord(item)) return [];
89
- const method = item["method"];
90
- const timestamp = item["timestamp"];
91
- if (typeof method !== "string" || method.length === 0) return [];
92
- if (timestamp !== void 0 && (typeof timestamp !== "number" || !Number.isFinite(timestamp))) {
93
- return [];
94
- }
95
- return [timestamp === void 0 ? { method } : { method, timestamp }];
96
- });
97
- }
98
- export {
99
- oauthSupabaseProvider
100
- };
1
+ import{createJwtVerifier,invalidToken,isRecord,normalizedProviderUrl,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,recordValue,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthSupabaseProvider(options){let supabaseUrl=resolveSupabaseUrl(options),issuer=providerEndpoint(supabaseUrl,"auth/v1").replace(/\/$/,""),secret=options.jwtSecret;if(secret!==void 0&&new TextEncoder().encode(secret).length<32)throw new TypeError("Supabase jwtSecret must be at least 32 bytes");return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(supabaseUrl,"auth/v1/.well-known/jwks.json")),...secret!==void 0?{key:new TextEncoder().encode(secret),algorithms:["HS256"]}:{algorithms:["ES256"]},resource}),oauthMetadata:{issuer,authorization_endpoint:providerEndpoint(supabaseUrl,"auth/v1/oauth/authorize"),token_endpoint:providerEndpoint(supabaseUrl,"auth/v1/oauth/token"),registration_endpoint:providerEndpoint(supabaseUrl,"auth/v1/oauth/clients/register"),response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token"],code_challenge_methods_supported:["S256"]},mapAuthInfo:mapUser})}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub")??requiredString(payload,"user_id");if(id===void 0)throw invalidToken("Missing Supabase subject");let userMetadata=recordValue(payload,"user_metadata")??{},aal=stringValue(payload,"aal");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("name",stringValue(userMetadata,"name")),...optional("fullName",stringValue(userMetadata,"full_name")),...optional("username",stringValue(userMetadata,"username")),...optional("avatarUrl",stringValue(userMetadata,"avatar_url")),...optional("role",stringValue(payload,"role")),...optional("aal",aal),amr:supabaseAmr(payload.amr),...optional("sessionId",stringValue(payload,"session_id"))},payload,permissions:aal===void 0?[]:[`aal:${aal}`]}}function optional(key,value){return value===void 0?{}:{[key]:value}}function resolveSupabaseUrl(options){if(options.supabaseUrl!==void 0)return normalizedProviderUrl(options.supabaseUrl,"supabaseUrl");if(options.projectId===void 0||!/^[a-z0-9-]+$/i.test(options.projectId))throw new TypeError("Supabase requires projectId or supabaseUrl");return new URL(`https://${options.projectId}.supabase.co`)}function supabaseAmr(value){return Array.isArray(value)?value.flatMap(item=>{if(!isRecord(item))return[];let method=item.method,timestamp=item.timestamp;return typeof method!="string"||method.length===0?[]:timestamp!==void 0&&(typeof timestamp!="number"||!Number.isFinite(timestamp))?[]:[timestamp===void 0?{method}:{method,timestamp}]}):[]}export{oauthSupabaseProvider};
@@ -1,76 +1 @@
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-YF5X7FYF.js";
13
-
14
- // src/oauth/workos.ts
15
- function oauthWorkOSProvider(options) {
16
- const issuer = workosIssuer(options.subdomain);
17
- return oauthCustomProvider({
18
- ...options,
19
- createTokenVerifier: (resource) => createJwtVerifier({
20
- issuer,
21
- jwksUrl: new URL(providerEndpoint(issuer, "oauth2/jwks")),
22
- resource
23
- }),
24
- oauthMetadata: {
25
- issuer,
26
- authorization_endpoint: providerEndpoint(issuer, "oauth2/authorize"),
27
- token_endpoint: providerEndpoint(issuer, "oauth2/token"),
28
- registration_endpoint: providerEndpoint(issuer, "oauth2/register"),
29
- response_types_supported: ["code"],
30
- grant_types_supported: ["authorization_code", "refresh_token"],
31
- code_challenge_methods_supported: ["S256"]
32
- },
33
- mapAuthInfo: mapUser
34
- });
35
- }
36
- function mapUser(authInfo) {
37
- const payload = payloadFromAuthInfo(authInfo);
38
- const id = requiredString(payload, "sub");
39
- if (id === void 0) throw invalidToken("Missing WorkOS subject");
40
- return {
41
- user: {
42
- id,
43
- ...optional("email", stringValue(payload, "email")),
44
- ...optional("emailVerified", booleanValue(payload, "email_verified")),
45
- ...optional("name", stringValue(payload, "name")),
46
- ...optional(
47
- "preferredUsername",
48
- stringValue(payload, "preferred_username")
49
- ),
50
- ...optional("firstName", stringValue(payload, "first_name")),
51
- ...optional("lastName", stringValue(payload, "last_name")),
52
- ...optional("picture", stringValue(payload, "picture")),
53
- roles: normalizedStrings(payload["roles"]),
54
- ...optional("organizationId", stringValue(payload, "org_id")),
55
- ...optional("sessionId", stringValue(payload, "sid"))
56
- },
57
- payload,
58
- permissions: normalizedStrings(payload["permissions"])
59
- };
60
- }
61
- function optional(key, value) {
62
- return value === void 0 ? {} : { [key]: value };
63
- }
64
- function workosIssuer(value) {
65
- if (typeof value !== "string" || value.trim().length === 0) {
66
- throw new TypeError("WorkOS subdomain is required");
67
- }
68
- const url = normalizedProviderUrl(value, "WorkOS subdomain");
69
- if (url.pathname !== "/") {
70
- throw new TypeError("WorkOS subdomain must be a hostname or HTTPS origin");
71
- }
72
- return url.href.replace(/\/$/, "");
73
- }
74
- export {
75
- oauthWorkOSProvider
76
- };
1
+ import{booleanValue,createJwtVerifier,invalidToken,normalizedProviderUrl,normalizedStrings,oauthCustomProvider,payloadFromAuthInfo,providerEndpoint,requiredString,stringValue}from"../chunk-JMDHTN6N.js";function oauthWorkOSProvider(options){let issuer=workosIssuer(options.subdomain);return oauthCustomProvider({...options,createTokenVerifier:resource=>createJwtVerifier({issuer,jwksUrl:new URL(providerEndpoint(issuer,"oauth2/jwks")),resource}),oauthMetadata:{issuer,authorization_endpoint:providerEndpoint(issuer,"oauth2/authorize"),token_endpoint:providerEndpoint(issuer,"oauth2/token"),registration_endpoint:providerEndpoint(issuer,"oauth2/register"),response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token"],code_challenge_methods_supported:["S256"]},mapAuthInfo:mapUser})}function mapUser(authInfo){let payload=payloadFromAuthInfo(authInfo),id=requiredString(payload,"sub");if(id===void 0)throw invalidToken("Missing WorkOS subject");return{user:{id,...optional("email",stringValue(payload,"email")),...optional("emailVerified",booleanValue(payload,"email_verified")),...optional("name",stringValue(payload,"name")),...optional("preferredUsername",stringValue(payload,"preferred_username")),...optional("firstName",stringValue(payload,"first_name")),...optional("lastName",stringValue(payload,"last_name")),...optional("picture",stringValue(payload,"picture")),roles:normalizedStrings(payload.roles),...optional("organizationId",stringValue(payload,"org_id")),...optional("sessionId",stringValue(payload,"sid"))},payload,permissions:normalizedStrings(payload.permissions)}}function optional(key,value){return value===void 0?{}:{[key]:value}}function workosIssuer(value){if(typeof value!="string"||value.trim().length===0)throw new TypeError("WorkOS subdomain is required");let url=normalizedProviderUrl(value,"WorkOS subdomain");if(url.pathname!=="/")throw new TypeError("WorkOS subdomain must be a hostname or HTTPS origin");return url.href.replace(/\/$/,"")}export{oauthWorkOSProvider};
@@ -1,6 +1 @@
1
- import {
2
- registerOpenAPITools
3
- } from "../chunk-HNNQJLD5.js";
4
- export {
5
- registerOpenAPITools
6
- };
1
+ import{registerOpenAPITools}from"../chunk-Y26DNVWA.js";export{registerOpenAPITools};
@@ -0,0 +1 @@
1
+ import{resolvePublicFilePath,servePublicFile}from"./chunk-ZMU5USAZ.js";export{resolvePublicFilePath,servePublicFile};
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.35",
4
+ "version": "2.0.0-beta.36",
5
5
  "description": "MCP framework and CLI built on the official v2 SDK",
6
6
  "author": "mcp-use, Inc.",
7
7
  "license": "MIT",
@@ -89,8 +89,8 @@
89
89
  "@modelcontextprotocol/server": "2.0.0-beta.5",
90
90
  "hono": "^4.12.27",
91
91
  "jose": "^6.1.3",
92
- "@mcp-use/cli": "4.0.0-beta.7",
93
- "@mcp-use/inspector": "20.0.0-beta.27"
92
+ "@mcp-use/inspector": "20.0.0-beta.28",
93
+ "@mcp-use/cli": "4.0.0-beta.8"
94
94
  },
95
95
  "peerDependencies": {
96
96
  "@mcp-use/client": "^2.0.0-alpha.0",
@@ -115,16 +115,17 @@
115
115
  "@types/react": "^19.2.17",
116
116
  "@types/react-dom": "^19.2.3",
117
117
  "@vitejs/plugin-react": "^6.0.3",
118
+ "es-module-lexer": "^2.3.0",
118
119
  "happy-dom": "^20.10.6",
119
120
  "react": "^19.2.7",
120
121
  "react-dom": "^19.2.7",
121
- "typescript": "^7.0.2",
122
122
  "tailwindcss": "^4.2.0",
123
+ "typescript": "^7.0.2",
123
124
  "vite": "^8.0.16",
124
125
  "vitest": "^4.1.9",
125
126
  "zod": "^4.4.3",
126
- "@mcp-use/client": "2.0.0-beta.12",
127
- "mcp-use": "2.0.0-beta.35"
127
+ "mcp-use": "2.0.0-beta.36",
128
+ "@mcp-use/client": "2.0.0-beta.12"
128
129
  },
129
130
  "publishConfig": {
130
131
  "access": "public"
@@ -1,37 +0,0 @@
1
- // src/completable.ts
2
- import {
3
- completable as sdkCompletable
4
- } from "@modelcontextprotocol/server";
5
- function createPrefixCompletion(values) {
6
- const strings = values.map(String);
7
- return (value) => {
8
- const prefix = String(value ?? "").toLowerCase();
9
- return strings.filter(
10
- (candidate) => candidate.toLowerCase().startsWith(prefix)
11
- );
12
- };
13
- }
14
- function completable(schema, complete) {
15
- if (typeof complete === "function") {
16
- return sdkCompletable(
17
- schema,
18
- (value, context) => complete(String(value ?? ""), context)
19
- );
20
- }
21
- return sdkCompletable(schema, createPrefixCompletion(complete));
22
- }
23
-
24
- // src/resource-completion.ts
25
- function normalizeCompletions(completions) {
26
- const normalized = /* @__PURE__ */ Object.create(null);
27
- for (const [variable, completer] of Object.entries(completions)) {
28
- if (completer === void 0) continue;
29
- normalized[variable] = Array.isArray(completer) ? createPrefixCompletion(completer) : completer;
30
- }
31
- return normalized;
32
- }
33
-
34
- export {
35
- completable,
36
- normalizeCompletions
37
- };
@@ -1,97 +0,0 @@
1
- // src/views/origin.ts
2
- function stripTrailingSlashes(value) {
3
- return value.replace(/\/+$/, "");
4
- }
5
- function readEnv(name) {
6
- if (typeof process === "undefined") {
7
- return void 0;
8
- }
9
- const value = process.env[name];
10
- return value !== void 0 && value !== "" ? value : void 0;
11
- }
12
- function parseForwardedHeader(header) {
13
- for (const part of header.split(",")) {
14
- const params = /* @__PURE__ */ new Map();
15
- for (const token of part.split(";")) {
16
- const [key, ...rest] = token.trim().split("=");
17
- if (key === void 0 || rest.length === 0) {
18
- continue;
19
- }
20
- params.set(key.toLowerCase(), rest.join("=").replace(/^"|"$/g, ""));
21
- }
22
- const proto = params.get("proto");
23
- const host = params.get("host");
24
- if (proto !== void 0 && host !== void 0) {
25
- return `${proto}://${host}`;
26
- }
27
- }
28
- return void 0;
29
- }
30
- function resolveRequestOriginFromHeaders(request) {
31
- const forwarded = request.headers.get("forwarded");
32
- if (forwarded !== null) {
33
- const fromForwarded = parseForwardedHeader(forwarded);
34
- if (fromForwarded !== void 0) {
35
- return fromForwarded;
36
- }
37
- }
38
- const proto = request.headers.get("x-forwarded-proto");
39
- const host = request.headers.get("x-forwarded-host");
40
- if (proto !== null && host !== null) {
41
- const firstHost = host.split(",")[0]?.trim();
42
- const firstProto = proto.split(",")[0]?.trim();
43
- if (firstHost !== void 0 && firstProto !== void 0 && firstHost !== "") {
44
- return `${firstProto}://${firstHost}`;
45
- }
46
- }
47
- return new URL(request.url).origin;
48
- }
49
- function resolveServerOrigin(request) {
50
- const mcpUrl = readEnv("MCP_URL");
51
- if (mcpUrl !== void 0) {
52
- try {
53
- return new URL(mcpUrl).origin;
54
- } catch {
55
- }
56
- }
57
- return resolveRequestOriginFromHeaders(request);
58
- }
59
- function originFromAssetsBase(assetsBase) {
60
- try {
61
- return new URL(assetsBase).origin;
62
- } catch {
63
- return assetsBase;
64
- }
65
- }
66
- function normalizeAssetsBaseUrl(value) {
67
- return stripTrailingSlashes(value);
68
- }
69
- function resolveAssetsBase(request) {
70
- const assetsUrl = readEnv("MCP_ASSETS_URL");
71
- if (assetsUrl !== void 0) {
72
- try {
73
- return normalizeAssetsBaseUrl(new URL(assetsUrl).href.replace(/\/$/, ""));
74
- } catch {
75
- }
76
- }
77
- return resolveServerOrigin(request);
78
- }
79
- function hasExplicitAssetsBase() {
80
- const assetsUrl = readEnv("MCP_ASSETS_URL");
81
- if (assetsUrl === void 0) {
82
- return false;
83
- }
84
- try {
85
- new URL(assetsUrl);
86
- return true;
87
- } catch {
88
- return false;
89
- }
90
- }
91
-
92
- export {
93
- resolveServerOrigin,
94
- originFromAssetsBase,
95
- resolveAssetsBase,
96
- hasExplicitAssetsBase
97
- };