@mcp-use/inspector 20.0.0-beta.0 → 20.0.0-beta.1

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 (63) hide show
  1. package/dist/cdn/{ChatTab-5ya_YTFV.js → ChatTab-D8uwCHAf.js} +2 -2
  2. package/dist/cdn/{ConnectionSettingsForm-iwNW86ZU.js → ConnectionSettingsForm-BNS6bOMD.js} +1 -1
  3. package/dist/cdn/{ConnectionSettingsTab-CeK83dxn.js → ConnectionSettingsTab-B97gPPJW.js} +1 -1
  4. package/dist/cdn/{OAuthCallback-BxuOVgdb.js → OAuthCallback-k3oeLtIC.js} +1 -1
  5. package/dist/cdn/{ResourcesTab-BczUMFil.js → ResourcesTab-KfamsM6-.js} +3 -3
  6. package/dist/cdn/{SamplingTab-6u5s845G.js → SamplingTab-vcufuK24.js} +1 -1
  7. package/dist/cdn/{ToolsTab-CUhwP4rZ.js → ToolsTab-DRjcZnpu.js} +3 -3
  8. package/dist/cdn/{ViewPreview-CxJc1Kht.js → ViewPreview-B_onhcUB.js} +2 -2
  9. package/dist/cdn/{WidgetWrapper-BJJtLqMb.js → WidgetWrapper-D29YDxIu.js} +1 -1
  10. package/dist/cdn/inspector.js +116 -109
  11. package/dist/cdn/{react-yUi9mVK4.js → react-BxO-uEDZ.js} +32 -26
  12. package/dist/cdn/{useViewHostProps-C7vjco2m.js → useViewHostProps-Dr6W2ooF.js} +1 -1
  13. package/dist/cli.js +116 -14
  14. package/dist/server/asset-urls.d.ts +14 -0
  15. package/dist/server/asset-urls.d.ts.map +1 -0
  16. package/dist/server/asset-urls.js +13 -0
  17. package/dist/server/cdn-shell.d.ts +3 -3
  18. package/dist/server/cdn-shell.d.ts.map +1 -1
  19. package/dist/server/cdn-shell.js +5 -3
  20. package/dist/server/{chunk-J67FVPHF.js → chunk-IXYK6ZOY.js} +1 -1
  21. package/dist/server/{chunk-ESODOPDD.js → chunk-J4FNYLBF.js} +4 -0
  22. package/dist/server/chunk-KBVKS4J5.js +53 -0
  23. package/dist/server/chunk-M5TZA42I.js +54 -0
  24. package/dist/server/{chunk-TPHRVELX.js → chunk-VDUV6LR6.js} +16 -9
  25. package/dist/server/{chunk-THQ67TSE.js → chunk-Y2GBQOQW.js} +1 -1
  26. package/dist/server/cli.js +6 -4
  27. package/dist/server/favicon-static.d.ts.map +1 -1
  28. package/dist/server/favicon-static.js +1 -1
  29. package/dist/server/index.js +7 -5
  30. package/dist/server/middleware.js +7 -5
  31. package/dist/server/static-assets.d.ts +5 -0
  32. package/dist/server/static-assets.d.ts.map +1 -0
  33. package/dist/server/static-assets.js +9 -0
  34. package/dist/server/version.js +1 -1
  35. package/dist/web/assets/{ChatTab-CiAqtqhj.js → ChatTab-Cy8eyFYI.js} +3 -3
  36. package/dist/web/assets/{ConnectionSettingsTab-CTh6MFKE.js → ConnectionSettingsTab-sDZGaUJn.js} +1 -1
  37. package/dist/web/assets/{ElicitationTab-B3Eg0_Jm.js → ElicitationTab-wDKgU1qL.js} +1 -1
  38. package/dist/web/assets/{ManufactOAuthCallback-B-tdkUA2.js → ManufactOAuthCallback-DCLbW-mz.js} +1 -1
  39. package/dist/web/assets/{NotificationsTab-BgLjxuos.js → NotificationsTab-JevzvJTg.js} +1 -1
  40. package/dist/web/assets/{OAuthCallback-Bp-jLoQs.js → OAuthCallback-BjcRxLh5.js} +1 -1
  41. package/dist/web/assets/{PromptsTab-CA-SZs43.js → PromptsTab-DsQVOjKH.js} +1 -1
  42. package/dist/web/assets/{ResourcesTab-DdMIW_af.js → ResourcesTab-Bw8_p6M1.js} +1 -1
  43. package/dist/web/assets/{SamplingTab-DjyDG01W.js → SamplingTab-BrcF1zJF.js} +1 -1
  44. package/dist/web/assets/{ServerMetadataTab-Q4PlqP_B.js → ServerMetadataTab-Bydeh1Po.js} +1 -1
  45. package/dist/web/assets/{ToolsTab-BHk8GCmd.js → ToolsTab-DJWF7Q_x.js} +1 -1
  46. package/dist/web/assets/{ViewPreview-DWtmwzCb.js → ViewPreview-jgeU7bY9.js} +1 -1
  47. package/dist/web/assets/{WidgetWrapper-B43lqbld.js → WidgetWrapper-B_vJU9uF.js} +1 -1
  48. package/dist/web/assets/{checkbox-_GzEPQic.js → checkbox-BA-XURSj.js} +1 -1
  49. package/dist/web/assets/{chunk-BO2N2NFS-BdIeB5Lr.js → chunk-BO2N2NFS-CGbd3eLY.js} +4 -4
  50. package/dist/web/assets/{dist-DQjEDTKs.js → dist-BcAQZluc.js} +3 -3
  51. package/dist/web/assets/{highlighted-body-OFNGDK62-Dp3e1QHL.js → highlighted-body-OFNGDK62-BBJFbIMp.js} +1 -1
  52. package/dist/web/assets/{index-Bbn-6QR2.js → index-D2UxaT9v.js} +3 -3
  53. package/dist/web/assets/mermaid-GHXKKRXX-B4MKVODA.js +1 -0
  54. package/dist/web/assets/{pdf-C3cfS_Ha.js → pdf-CuwKm9zO.js} +1 -1
  55. package/dist/web/assets/{shared-Dfwy7nyg.js → shared-DQE60Op-.js} +1 -1
  56. package/dist/web/assets/{sheet-CRPrEqAa.js → sheet-7TIkLdpr.js} +1 -1
  57. package/dist/web/assets/{tabs-subtle-Dxgism9f.js → tabs-subtle-AkJZvdxS.js} +1 -1
  58. package/dist/web/assets/{useConfig-b1f_iVFH.js → useConfig-Qglo4xs1.js} +1 -1
  59. package/dist/web/assets/{useMCPPrompts-CPskz9af.js → useMCPPrompts-USLYc1I4.js} +1 -1
  60. package/dist/web/assets/{useViewHostProps-BgsQ2yYl.js → useViewHostProps-DXAD1g7g.js} +1 -1
  61. package/dist/web/index.html +1 -1
  62. package/package.json +5 -5
  63. package/dist/web/assets/mermaid-GHXKKRXX-yq1lkD3x.js +0 -1
@@ -3536,32 +3536,38 @@ function sa(e) {
3536
3536
  };
3537
3537
  }
3538
3538
  function ca(e) {
3539
- let t = null, n = Date.now(), r = e.healthCheckIntervalMs ?? 1e4, i = e.healthCheckTimeoutMs ?? 3e4;
3539
+ let t = null, n = Date.now(), r = !1, i = e.healthCheckIntervalMs ?? 1e4, a = e.healthCheckTimeoutMs ?? 3e4;
3540
3540
  return t = setInterval(async () => {
3541
- if (!e.isMountedRef.current || e.stateRef.current !== "ready") {
3542
- t &&= (clearInterval(t), null);
3543
- return;
3544
- }
3545
- try {
3546
- let t = e.gatewayUrl || e.url;
3547
- if (!t) return;
3548
- let r = e.getAuthHeaders ? await e.getAuthHeaders() : {}, i = await fetch(t, {
3549
- method: "HEAD",
3550
- headers: {
3551
- ...e.allHeaders,
3552
- ...r
3553
- },
3554
- signal: AbortSignal.timeout(5e3)
3555
- });
3556
- if (i.ok || i.status < 500) n = Date.now();
3557
- else throw Error(`Server returned ${i.status}`);
3558
- } catch {
3559
- let r = Date.now() - n;
3560
- r > i && (e.addLog("warn", `Connection appears to be broken (no response for ${Math.round(r / 1e3)}s), attempting to reconnect...`), t &&= (clearInterval(t), null), e.autoReconnectRef.current && e.isMountedRef.current && (e.setState("discovering"), e.addLog("info", "Auto-reconnecting to MCP server..."), setTimeout(() => {
3561
- e.isMountedRef.current && e.stateRef.current === "discovering" && e.connect();
3562
- }, typeof e.autoReconnectRef.current == "number" ? e.autoReconnectRef.current : e.defaultReconnectDelay)));
3541
+ if (!r) {
3542
+ if (!e.isMountedRef.current || e.stateRef.current !== "ready") {
3543
+ t &&= (clearInterval(t), null);
3544
+ return;
3545
+ }
3546
+ try {
3547
+ let i = e.gatewayUrl || e.url;
3548
+ if (!i) return;
3549
+ let a = e.getAuthHeaders ? await e.getAuthHeaders() : {}, o = await fetch(i, {
3550
+ method: "HEAD",
3551
+ headers: {
3552
+ ...e.allHeaders,
3553
+ ...a
3554
+ },
3555
+ signal: AbortSignal.timeout(5e3)
3556
+ });
3557
+ if (o.status === 405 || o.status === 404) {
3558
+ r = !0, n = Date.now(), t &&= (clearInterval(t), null);
3559
+ return;
3560
+ }
3561
+ if (o.ok || o.status < 500) n = Date.now();
3562
+ else throw Error(`Server returned ${o.status}`);
3563
+ } catch {
3564
+ let r = Date.now() - n;
3565
+ r > a && (e.addLog("warn", `Connection appears to be broken (no response for ${Math.round(r / 1e3)}s), attempting to reconnect...`), t &&= (clearInterval(t), null), e.autoReconnectRef.current && e.isMountedRef.current && (e.setState("discovering"), e.addLog("info", "Auto-reconnecting to MCP server..."), setTimeout(() => {
3566
+ e.isMountedRef.current && e.stateRef.current === "discovering" && e.connect();
3567
+ }, typeof e.autoReconnectRef.current == "number" ? e.autoReconnectRef.current : e.defaultReconnectDelay)));
3568
+ }
3563
3569
  }
3564
- }, r), () => {
3570
+ }, i), () => {
3565
3571
  t &&= (clearInterval(t), null);
3566
3572
  };
3567
3573
  }
@@ -4879,8 +4885,8 @@ function Na({ children: e, mcpServers: t, defaultCallbackUrl: n, defaultOAuthPro
4879
4885
  h,
4880
4886
  ae,
4881
4887
  o
4882
- ]);
4883
- return /* @__PURE__ */ M.createElement(Aa.Provider, { value: N }, e, I.map((e) => /* @__PURE__ */ M.createElement(Ma, {
4888
+ ]), oe = typeof window < "u" && /\/oauth\/callback\/?$/.test(window.location.pathname);
4889
+ return /* @__PURE__ */ M.createElement(Aa.Provider, { value: N }, e, !oe && I.map((e) => /* @__PURE__ */ M.createElement(Ma, {
4884
4890
  key: `${e.id}-v${ee[e.id] ?? 0}`,
4885
4891
  id: e.id,
4886
4892
  options: e.options,
@@ -1,5 +1,5 @@
1
1
  import { s as e, t } from "./react-BIs9pQ3H.js";
2
- import { d as n } from "./react-yUi9mVK4.js";
2
+ import { d as n } from "./react-BxO-uEDZ.js";
3
3
  import { i as r, r as i, s as a, t as o } from "./WidgetDebugContext-D4usL_MA.js";
4
4
  //#region src/client/console-log-bus.ts
5
5
  var s = /* @__PURE__ */ e(t(), 1), c = new class {
package/dist/cli.js CHANGED
@@ -7,6 +7,53 @@ import { cors as cors2 } from "hono/cors";
7
7
  import { logger as logger2 } from "hono/logger";
8
8
  import open from "open";
9
9
 
10
+ // src/server/asset-urls.ts
11
+ var JSDELIVR_INSPECTOR_TAG = "beta";
12
+ var DEFAULT_REMOTE_ASSETS_URL = `https://cdn.jsdelivr.net/npm/@mcp-use/inspector@${JSDELIVR_INSPECTOR_TAG}/dist/cdn/inspector.js`;
13
+ function inspectorStylesUrl(assetsUrl) {
14
+ return assetsUrl.replace(/\.js(?=$|[?#])/, ".css");
15
+ }
16
+ function resolveInspectorAssetUrls(inspectorMode2, basePath) {
17
+ const envUrl = process.env.INSPECTOR_ASSETS_URL ?? process.env.MCP_USE_INSPECTOR_ASSETS_URL;
18
+ if (envUrl) {
19
+ return {
20
+ jsUrl: envUrl,
21
+ cssUrl: inspectorStylesUrl(envUrl),
22
+ useLocal: false
23
+ };
24
+ }
25
+ const legacyBase = process.env.INSPECTOR_CDN_BASE;
26
+ if (legacyBase) {
27
+ const base = legacyBase.replace(/\/$/, "");
28
+ if (/\.js(?:$|[?#])/.test(base)) {
29
+ return {
30
+ jsUrl: base,
31
+ cssUrl: inspectorStylesUrl(base),
32
+ useLocal: false
33
+ };
34
+ }
35
+ return {
36
+ jsUrl: `${base}/inspector.js`,
37
+ cssUrl: `${base}/inspector.css`,
38
+ useLocal: false
39
+ };
40
+ }
41
+ if (inspectorMode2 === "standalone") {
42
+ const prefix = basePath;
43
+ return {
44
+ jsUrl: `${prefix}/dist/cdn/inspector.js`,
45
+ cssUrl: `${prefix}/dist/cdn/inspector.css`,
46
+ useLocal: true
47
+ };
48
+ }
49
+ const jsUrl = DEFAULT_REMOTE_ASSETS_URL;
50
+ return {
51
+ jsUrl,
52
+ cssUrl: inspectorStylesUrl(jsUrl),
53
+ useLocal: false
54
+ };
55
+ }
56
+
10
57
  // src/server/favicon-links.ts
11
58
  var FAVICON_CACHE_VERSION = "4";
12
59
  var INSPECTOR_FAVICON_ASSETS = [
@@ -39,8 +86,12 @@ var CONTENT_TYPES = {
39
86
  function resolveFaviconDir() {
40
87
  const here = path.dirname(fileURLToPath(import.meta.url));
41
88
  for (const dir of [
89
+ path.resolve(here, "cdn"),
90
+ // dist/cli.js (bundled)
42
91
  path.resolve(here, "../cdn"),
92
+ // dist/server/*.js
43
93
  path.resolve(here, "../../public")
94
+ // src/server/*.ts (dev)
44
95
  ]) {
45
96
  if (existsSync(path.join(dir, "favicon-black.svg"))) {
46
97
  return dir;
@@ -69,6 +120,56 @@ function registerInspectorFaviconStatic(app2, basePath = "") {
69
120
  }
70
121
  }
71
122
 
123
+ // src/server/static-assets.ts
124
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
125
+ import path2 from "path";
126
+ import { fileURLToPath as fileURLToPath2 } from "url";
127
+ var CONTENT_TYPES2 = {
128
+ ".js": "application/javascript",
129
+ ".css": "text/css",
130
+ ".svg": "image/svg+xml",
131
+ ".png": "image/png",
132
+ ".ico": "image/x-icon",
133
+ ".webmanifest": "application/manifest+json"
134
+ };
135
+ function resolveDistCdnDir() {
136
+ const here = path2.dirname(fileURLToPath2(import.meta.url));
137
+ for (const dir of [
138
+ path2.resolve(here, "cdn"),
139
+ // dist/cli.js (bundled)
140
+ path2.resolve(here, "../cdn")
141
+ // dist/server/*.js
142
+ ]) {
143
+ if (existsSync2(path2.join(dir, "inspector.js"))) {
144
+ return dir;
145
+ }
146
+ }
147
+ throw new Error(
148
+ "Inspector bundle not found (expected dist/cdn/inspector.js)"
149
+ );
150
+ }
151
+ function registerInspectorStaticAssets(app2, basePath = "") {
152
+ const cdnDir = resolveDistCdnDir();
153
+ const mountPath = `${basePath}/dist/cdn`;
154
+ app2.get(`${mountPath}/*`, (c) => {
155
+ const subPath = c.req.path.slice(mountPath.length);
156
+ const relative = subPath.startsWith("/") ? subPath.slice(1) : subPath;
157
+ if (!relative || relative.includes("..")) {
158
+ return c.notFound();
159
+ }
160
+ const file = path2.resolve(cdnDir, relative);
161
+ const root = cdnDir.endsWith(path2.sep) ? cdnDir : `${cdnDir}${path2.sep}`;
162
+ if (!file.startsWith(root) || !existsSync2(file)) {
163
+ return c.notFound();
164
+ }
165
+ const ext = path2.extname(file);
166
+ return c.body(readFileSync2(file), 200, {
167
+ "Content-Type": CONTENT_TYPES2[ext] ?? "application/octet-stream",
168
+ "Cache-Control": "public, max-age=3600"
169
+ });
170
+ });
171
+ }
172
+
72
173
  // package.json
73
174
  var package_default = {
74
175
  name: "@mcp-use/inspector",
@@ -130,7 +231,7 @@ var package_default = {
130
231
  "build:server": "tsup 'src/server/**/*.ts' --format esm --out-dir dist/server && tsc -p tsconfig.server.json --emitDeclarationOnly --declaration",
131
232
  "build:cli": "tsup src/server/cli.ts --format esm --out-dir dist/",
132
233
  prepublishOnly: "pnpm --filter @mcp-use/client build && pnpm build",
133
- start: "node dist/server/server.js",
234
+ start: "node dist/cli.js --port 3000",
134
235
  preview: "vite preview",
135
236
  "type-check": "tsc --noEmit",
136
237
  lint: "eslint .",
@@ -230,15 +331,12 @@ function getInspectorVersion() {
230
331
 
231
332
  // src/server/cdn-shell.ts
232
333
  var INSPECTOR_VERSION = getInspectorVersion();
233
- var CDN_BASE = process.env.INSPECTOR_CDN_BASE ?? "https://inspector-cdn.mcp-use.com";
234
- var CDN_JS_URL = `${CDN_BASE}/inspector@${INSPECTOR_VERSION}.js`;
235
- var CDN_CSS_URL = `${CDN_BASE}/inspector@${INSPECTOR_VERSION}.css`;
236
334
  var OAUTH_POPUP_CLOSED_HTML = `<!doctype html>
237
335
  <html lang="en"><head><meta charset="utf-8"><title>Signed in</title><meta name="robots" content="noindex"><style>html,body{margin:0;height:100%;display:flex;align-items:center;justify-content:center;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#4b5563;background:#fff}</style></head>
238
336
  <body><div>Signed in. You can close this window.</div>
239
337
  <script>try{if(window.opener&&!window.opener.closed)window.opener.postMessage({type:"manufact:oauth-complete"},"*")}catch(e){}try{window.close()}catch(e){}</script>
240
338
  </body></html>`;
241
- function generateCdnShellHtml(config, basePath = "") {
339
+ function generateCdnShellHtml(config, basePath, assets) {
242
340
  const scripts = [];
243
341
  if (config?.basePath !== void 0) {
244
342
  scripts.push(
@@ -283,7 +381,7 @@ function generateCdnShellHtml(config, basePath = "") {
283
381
  <link rel="preconnect" href="https://fonts.googleapis.com" />
284
382
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
285
383
  <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet" />
286
- <link rel="stylesheet" href="${CDN_CSS_URL}" />
384
+ <link rel="stylesheet" href="${assets.cssUrl}" />
287
385
  <title>Inspector | mcp-use</title>
288
386
  <meta name="description" content="Free, open-source MCP Inspector by mcp-use. Connect to any MCP server, test tools, prompts, and resources, inspect RPC logs, and debug MCP apps \u2014 all in your browser." />
289
387
  <script>window.__INSPECTOR_VERSION__ = ${JSON.stringify(INSPECTOR_VERSION)};</script>
@@ -304,11 +402,12 @@ function generateCdnShellHtml(config, basePath = "") {
304
402
  }
305
403
  </script>
306
404
  <div id="root"></div>
307
- <script type="module" src="${CDN_JS_URL}"></script>
405
+ <script type="module" src="${assets.jsUrl}"></script>
308
406
  </body>
309
407
  </html>`;
310
408
  }
311
409
  function registerInspectorCdnShell(app2, config, basePath = "") {
410
+ const assets = resolveInspectorAssetUrls(config?.inspectorMode, basePath);
312
411
  const p = (suffix) => `${basePath}${suffix}`;
313
412
  const effectiveConfig = {
314
413
  ...config,
@@ -316,7 +415,7 @@ function registerInspectorCdnShell(app2, config, basePath = "") {
316
415
  proxyUrl: config?.proxyUrl !== void 0 ? config.proxyUrl : p("/inspector/api/proxy"),
317
416
  disableTelemetry: config?.disableTelemetry ?? process.env.MCP_USE_ANONYMIZED_TELEMETRY === "false"
318
417
  };
319
- const serveShell = (c) => c.html(generateCdnShellHtml(effectiveConfig, basePath));
418
+ const serveShell = (c) => c.html(generateCdnShellHtml(effectiveConfig, basePath, assets));
320
419
  registerInspectorFaviconStatic(app2, basePath);
321
420
  app2.get(
322
421
  p("/inspector/oauth-popup-closed.html"),
@@ -343,6 +442,9 @@ function registerInspectorCdnShell(app2, config, basePath = "") {
343
442
  return c.redirect(`${p("/inspector")}${url.search}`);
344
443
  });
345
444
  }
445
+ if (assets.useLocal) {
446
+ registerInspectorStaticAssets(app2, basePath);
447
+ }
346
448
  }
347
449
 
348
450
  // src/server/proxy/mcp-proxy.ts
@@ -645,18 +747,18 @@ function classifyMetadataTarget(serverUrl, target, binding) {
645
747
  return void 0;
646
748
  }
647
749
  function protectedResourceMetadataUrls(serverUrl) {
648
- const path2 = serverUrl.pathname === "/" ? "" : serverUrl.pathname;
750
+ const path3 = serverUrl.pathname === "/" ? "" : serverUrl.pathname;
649
751
  return [
650
- new URL(`/.well-known/oauth-protected-resource${path2}`, serverUrl.origin),
752
+ new URL(`/.well-known/oauth-protected-resource${path3}`, serverUrl.origin),
651
753
  new URL("/.well-known/oauth-protected-resource", serverUrl.origin)
652
754
  ];
653
755
  }
654
756
  function authorizationServerMetadataUrls(issuer) {
655
- const path2 = issuer.pathname === "/" ? "" : issuer.pathname;
757
+ const path3 = issuer.pathname === "/" ? "" : issuer.pathname;
656
758
  return [
657
- new URL(`/.well-known/oauth-authorization-server${path2}`, issuer.origin),
658
- new URL(`/.well-known/openid-configuration${path2}`, issuer.origin),
659
- new URL(`${path2 || ""}/.well-known/openid-configuration`, issuer.origin)
759
+ new URL(`/.well-known/oauth-authorization-server${path3}`, issuer.origin),
760
+ new URL(`/.well-known/openid-configuration${path3}`, issuer.origin),
761
+ new URL(`${path3 || ""}/.well-known/openid-configuration`, issuer.origin)
660
762
  ];
661
763
  }
662
764
  async function bindProtectedResource(metadata, serverUrl, binding, allowLoopback) {
@@ -0,0 +1,14 @@
1
+ /** How the inspector is being served (telemetry + hosted UI behavior). */
2
+ export type InspectorMode = "standalone" | "embedded" | "cloud";
3
+ /** npm dist-tag for remote inspector bundles (matches mcp-use server). */
4
+ export declare const JSDELIVR_INSPECTOR_TAG = "beta";
5
+ export declare const DEFAULT_REMOTE_ASSETS_URL = "https://cdn.jsdelivr.net/npm/@mcp-use/inspector@beta/dist/cdn/inspector.js";
6
+ /** Derive the stylesheet URL from a bundle script URL. */
7
+ export declare function inspectorStylesUrl(assetsUrl: string): string;
8
+ export type InspectorAssetUrls = {
9
+ jsUrl: string;
10
+ cssUrl: string;
11
+ useLocal: boolean;
12
+ };
13
+ export declare function resolveInspectorAssetUrls(inspectorMode: InspectorMode | undefined, basePath: string): InspectorAssetUrls;
14
+ //# sourceMappingURL=asset-urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-urls.d.ts","sourceRoot":"","sources":["../../src/server/asset-urls.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhE,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAE7C,eAAO,MAAM,yBAAyB,+EAAoG,CAAC;AAE3I,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,QAAQ,EAAE,MAAM,GACf,kBAAkB,CA6CpB"}
@@ -0,0 +1,13 @@
1
+ import {
2
+ DEFAULT_REMOTE_ASSETS_URL,
3
+ JSDELIVR_INSPECTOR_TAG,
4
+ inspectorStylesUrl,
5
+ resolveInspectorAssetUrls
6
+ } from "./chunk-KBVKS4J5.js";
7
+ import "./chunk-PKBMQBKP.js";
8
+ export {
9
+ DEFAULT_REMOTE_ASSETS_URL,
10
+ JSDELIVR_INSPECTOR_TAG,
11
+ inspectorStylesUrl,
12
+ resolveInspectorAssetUrls
13
+ };
@@ -1,6 +1,6 @@
1
1
  import type { Hono } from "hono";
2
- /** How the inspector is being served (telemetry + hosted UI behavior). */
3
- export type InspectorMode = "standalone" | "embedded" | "cloud";
2
+ import { type InspectorMode } from "./asset-urls.js";
3
+ export type { InspectorMode } from "./asset-urls.js";
4
4
  export type CdnShellConfig = {
5
5
  basePath?: string;
6
6
  devMode?: boolean;
@@ -12,7 +12,7 @@ export type CdnShellConfig = {
12
12
  disableTelemetry?: boolean;
13
13
  };
14
14
  /**
15
- * Serve the inspector UI from CDN at `${basePath}/inspector`.
15
+ * Serve the inspector UI at `${basePath}/inspector`.
16
16
  */
17
17
  export declare function registerInspectorCdnShell(app: Hono, config?: CdnShellConfig, basePath?: string): void;
18
18
  //# sourceMappingURL=cdn-shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cdn-shell.d.ts","sourceRoot":"","sources":["../../src/server/cdn-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAY1C,0EAA0E;AAC1E,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,UAAU,GAAG,OAAO,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAgFF;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,IAAI,EACT,MAAM,CAAC,EAAE,cAAc,EACvB,QAAQ,GAAE,MAAW,QA8CtB"}
1
+ {"version":3,"file":"cdn-shell.d.ts","sourceRoot":"","sources":["../../src/server/cdn-shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAQhF,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAoFF;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,IAAI,EACT,MAAM,CAAC,EAAE,cAAc,EACvB,QAAQ,GAAE,MAAW,QAmDtB"}
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  registerInspectorCdnShell
3
- } from "./chunk-TPHRVELX.js";
4
- import "./chunk-THQ67TSE.js";
5
- import "./chunk-ESODOPDD.js";
3
+ } from "./chunk-VDUV6LR6.js";
4
+ import "./chunk-M5TZA42I.js";
5
+ import "./chunk-Y2GBQOQW.js";
6
+ import "./chunk-KBVKS4J5.js";
7
+ import "./chunk-J4FNYLBF.js";
6
8
  import "./chunk-WFT4JHYI.js";
7
9
  import "./chunk-PKBMQBKP.js";
8
10
  export {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  registerInspectorCdnShell
3
- } from "./chunk-TPHRVELX.js";
3
+ } from "./chunk-VDUV6LR6.js";
4
4
  import {
5
5
  registerInspectorProxyRoutes
6
6
  } from "./chunk-5B3SXGZP.js";
@@ -15,8 +15,12 @@ var CONTENT_TYPES = {
15
15
  function resolveFaviconDir() {
16
16
  const here = path.dirname(fileURLToPath(import.meta.url));
17
17
  for (const dir of [
18
+ path.resolve(here, "cdn"),
19
+ // dist/cli.js (bundled)
18
20
  path.resolve(here, "../cdn"),
21
+ // dist/server/*.js
19
22
  path.resolve(here, "../../public")
23
+ // src/server/*.ts (dev)
20
24
  ]) {
21
25
  if (existsSync(path.join(dir, "favicon-black.svg"))) {
22
26
  return dir;
@@ -0,0 +1,53 @@
1
+ // src/server/asset-urls.ts
2
+ var JSDELIVR_INSPECTOR_TAG = "beta";
3
+ var DEFAULT_REMOTE_ASSETS_URL = `https://cdn.jsdelivr.net/npm/@mcp-use/inspector@${JSDELIVR_INSPECTOR_TAG}/dist/cdn/inspector.js`;
4
+ function inspectorStylesUrl(assetsUrl) {
5
+ return assetsUrl.replace(/\.js(?=$|[?#])/, ".css");
6
+ }
7
+ function resolveInspectorAssetUrls(inspectorMode, basePath) {
8
+ const envUrl = process.env.INSPECTOR_ASSETS_URL ?? process.env.MCP_USE_INSPECTOR_ASSETS_URL;
9
+ if (envUrl) {
10
+ return {
11
+ jsUrl: envUrl,
12
+ cssUrl: inspectorStylesUrl(envUrl),
13
+ useLocal: false
14
+ };
15
+ }
16
+ const legacyBase = process.env.INSPECTOR_CDN_BASE;
17
+ if (legacyBase) {
18
+ const base = legacyBase.replace(/\/$/, "");
19
+ if (/\.js(?:$|[?#])/.test(base)) {
20
+ return {
21
+ jsUrl: base,
22
+ cssUrl: inspectorStylesUrl(base),
23
+ useLocal: false
24
+ };
25
+ }
26
+ return {
27
+ jsUrl: `${base}/inspector.js`,
28
+ cssUrl: `${base}/inspector.css`,
29
+ useLocal: false
30
+ };
31
+ }
32
+ if (inspectorMode === "standalone") {
33
+ const prefix = basePath;
34
+ return {
35
+ jsUrl: `${prefix}/dist/cdn/inspector.js`,
36
+ cssUrl: `${prefix}/dist/cdn/inspector.css`,
37
+ useLocal: true
38
+ };
39
+ }
40
+ const jsUrl = DEFAULT_REMOTE_ASSETS_URL;
41
+ return {
42
+ jsUrl,
43
+ cssUrl: inspectorStylesUrl(jsUrl),
44
+ useLocal: false
45
+ };
46
+ }
47
+
48
+ export {
49
+ JSDELIVR_INSPECTOR_TAG,
50
+ DEFAULT_REMOTE_ASSETS_URL,
51
+ inspectorStylesUrl,
52
+ resolveInspectorAssetUrls
53
+ };
@@ -0,0 +1,54 @@
1
+ // src/server/static-assets.ts
2
+ import { existsSync, readFileSync } from "fs";
3
+ import path from "path";
4
+ import { fileURLToPath } from "url";
5
+ var CONTENT_TYPES = {
6
+ ".js": "application/javascript",
7
+ ".css": "text/css",
8
+ ".svg": "image/svg+xml",
9
+ ".png": "image/png",
10
+ ".ico": "image/x-icon",
11
+ ".webmanifest": "application/manifest+json"
12
+ };
13
+ function resolveDistCdnDir() {
14
+ const here = path.dirname(fileURLToPath(import.meta.url));
15
+ for (const dir of [
16
+ path.resolve(here, "cdn"),
17
+ // dist/cli.js (bundled)
18
+ path.resolve(here, "../cdn")
19
+ // dist/server/*.js
20
+ ]) {
21
+ if (existsSync(path.join(dir, "inspector.js"))) {
22
+ return dir;
23
+ }
24
+ }
25
+ throw new Error(
26
+ "Inspector bundle not found (expected dist/cdn/inspector.js)"
27
+ );
28
+ }
29
+ function registerInspectorStaticAssets(app, basePath = "") {
30
+ const cdnDir = resolveDistCdnDir();
31
+ const mountPath = `${basePath}/dist/cdn`;
32
+ app.get(`${mountPath}/*`, (c) => {
33
+ const subPath = c.req.path.slice(mountPath.length);
34
+ const relative = subPath.startsWith("/") ? subPath.slice(1) : subPath;
35
+ if (!relative || relative.includes("..")) {
36
+ return c.notFound();
37
+ }
38
+ const file = path.resolve(cdnDir, relative);
39
+ const root = cdnDir.endsWith(path.sep) ? cdnDir : `${cdnDir}${path.sep}`;
40
+ if (!file.startsWith(root) || !existsSync(file)) {
41
+ return c.notFound();
42
+ }
43
+ const ext = path.extname(file);
44
+ return c.body(readFileSync(file), 200, {
45
+ "Content-Type": CONTENT_TYPES[ext] ?? "application/octet-stream",
46
+ "Cache-Control": "public, max-age=3600"
47
+ });
48
+ });
49
+ }
50
+
51
+ export {
52
+ resolveDistCdnDir,
53
+ registerInspectorStaticAssets
54
+ };
@@ -1,24 +1,27 @@
1
+ import {
2
+ registerInspectorStaticAssets
3
+ } from "./chunk-M5TZA42I.js";
1
4
  import {
2
5
  getInspectorVersion
3
- } from "./chunk-THQ67TSE.js";
6
+ } from "./chunk-Y2GBQOQW.js";
7
+ import {
8
+ resolveInspectorAssetUrls
9
+ } from "./chunk-KBVKS4J5.js";
4
10
  import {
5
11
  registerInspectorFaviconStatic
6
- } from "./chunk-ESODOPDD.js";
12
+ } from "./chunk-J4FNYLBF.js";
7
13
  import {
8
14
  renderInspectorFaviconLinks
9
15
  } from "./chunk-WFT4JHYI.js";
10
16
 
11
17
  // src/server/cdn-shell.ts
12
18
  var INSPECTOR_VERSION = getInspectorVersion();
13
- var CDN_BASE = process.env.INSPECTOR_CDN_BASE ?? "https://inspector-cdn.mcp-use.com";
14
- var CDN_JS_URL = `${CDN_BASE}/inspector@${INSPECTOR_VERSION}.js`;
15
- var CDN_CSS_URL = `${CDN_BASE}/inspector@${INSPECTOR_VERSION}.css`;
16
19
  var OAUTH_POPUP_CLOSED_HTML = `<!doctype html>
17
20
  <html lang="en"><head><meta charset="utf-8"><title>Signed in</title><meta name="robots" content="noindex"><style>html,body{margin:0;height:100%;display:flex;align-items:center;justify-content:center;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#4b5563;background:#fff}</style></head>
18
21
  <body><div>Signed in. You can close this window.</div>
19
22
  <script>try{if(window.opener&&!window.opener.closed)window.opener.postMessage({type:"manufact:oauth-complete"},"*")}catch(e){}try{window.close()}catch(e){}</script>
20
23
  </body></html>`;
21
- function generateCdnShellHtml(config, basePath = "") {
24
+ function generateCdnShellHtml(config, basePath, assets) {
22
25
  const scripts = [];
23
26
  if (config?.basePath !== void 0) {
24
27
  scripts.push(
@@ -63,7 +66,7 @@ function generateCdnShellHtml(config, basePath = "") {
63
66
  <link rel="preconnect" href="https://fonts.googleapis.com" />
64
67
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
65
68
  <link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;500;700&display=swap" rel="stylesheet" />
66
- <link rel="stylesheet" href="${CDN_CSS_URL}" />
69
+ <link rel="stylesheet" href="${assets.cssUrl}" />
67
70
  <title>Inspector | mcp-use</title>
68
71
  <meta name="description" content="Free, open-source MCP Inspector by mcp-use. Connect to any MCP server, test tools, prompts, and resources, inspect RPC logs, and debug MCP apps \u2014 all in your browser." />
69
72
  <script>window.__INSPECTOR_VERSION__ = ${JSON.stringify(INSPECTOR_VERSION)};</script>
@@ -84,11 +87,12 @@ function generateCdnShellHtml(config, basePath = "") {
84
87
  }
85
88
  </script>
86
89
  <div id="root"></div>
87
- <script type="module" src="${CDN_JS_URL}"></script>
90
+ <script type="module" src="${assets.jsUrl}"></script>
88
91
  </body>
89
92
  </html>`;
90
93
  }
91
94
  function registerInspectorCdnShell(app, config, basePath = "") {
95
+ const assets = resolveInspectorAssetUrls(config?.inspectorMode, basePath);
92
96
  const p = (suffix) => `${basePath}${suffix}`;
93
97
  const effectiveConfig = {
94
98
  ...config,
@@ -96,7 +100,7 @@ function registerInspectorCdnShell(app, config, basePath = "") {
96
100
  proxyUrl: config?.proxyUrl !== void 0 ? config.proxyUrl : p("/inspector/api/proxy"),
97
101
  disableTelemetry: config?.disableTelemetry ?? process.env.MCP_USE_ANONYMIZED_TELEMETRY === "false"
98
102
  };
99
- const serveShell = (c) => c.html(generateCdnShellHtml(effectiveConfig, basePath));
103
+ const serveShell = (c) => c.html(generateCdnShellHtml(effectiveConfig, basePath, assets));
100
104
  registerInspectorFaviconStatic(app, basePath);
101
105
  app.get(
102
106
  p("/inspector/oauth-popup-closed.html"),
@@ -123,6 +127,9 @@ function registerInspectorCdnShell(app, config, basePath = "") {
123
127
  return c.redirect(`${p("/inspector")}${url.search}`);
124
128
  });
125
129
  }
130
+ if (assets.useLocal) {
131
+ registerInspectorStaticAssets(app, basePath);
132
+ }
126
133
  }
127
134
 
128
135
  export {
@@ -59,7 +59,7 @@ var package_default = {
59
59
  "build:server": "tsup 'src/server/**/*.ts' --format esm --out-dir dist/server && tsc -p tsconfig.server.json --emitDeclarationOnly --declaration",
60
60
  "build:cli": "tsup src/server/cli.ts --format esm --out-dir dist/",
61
61
  prepublishOnly: "pnpm --filter @mcp-use/client build && pnpm build",
62
- start: "node dist/server/server.js",
62
+ start: "node dist/cli.js --port 3000",
63
63
  preview: "vite preview",
64
64
  "type-check": "tsc --noEmit",
65
65
  lint: "eslint .",
@@ -5,18 +5,20 @@ import {
5
5
  } from "./chunk-KD7K27XK.js";
6
6
  import {
7
7
  registerInspectorCdnShell
8
- } from "./chunk-TPHRVELX.js";
8
+ } from "./chunk-VDUV6LR6.js";
9
+ import "./chunk-M5TZA42I.js";
9
10
  import {
10
11
  getInspectorVersion
11
- } from "./chunk-THQ67TSE.js";
12
- import "./chunk-ESODOPDD.js";
13
- import "./chunk-WFT4JHYI.js";
12
+ } from "./chunk-Y2GBQOQW.js";
13
+ import "./chunk-KBVKS4J5.js";
14
14
  import {
15
15
  registerInspectorProxyRoutes
16
16
  } from "./chunk-5B3SXGZP.js";
17
17
  import "./chunk-IKTZUWSX.js";
18
18
  import "./chunk-6XWDZEFF.js";
19
19
  import "./chunk-K2F2AJOI.js";
20
+ import "./chunk-J4FNYLBF.js";
21
+ import "./chunk-WFT4JHYI.js";
20
22
  import "./chunk-PKBMQBKP.js";
21
23
 
22
24
  // src/server/cli.ts
@@ -1 +1 @@
1
- {"version":3,"file":"favicon-static.d.ts","sourceRoot":"","sources":["../../src/server/favicon-static.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAyBjC,uEAAuE;AACvE,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,IAAI,EACT,QAAQ,GAAE,MAAW,QAmBtB"}
1
+ {"version":3,"file":"favicon-static.d.ts","sourceRoot":"","sources":["../../src/server/favicon-static.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA0BjC,uEAAuE;AACvE,wBAAgB,8BAA8B,CAC5C,GAAG,EAAE,IAAI,EACT,QAAQ,GAAE,MAAW,QAmBtB"}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  registerInspectorFaviconStatic
3
- } from "./chunk-ESODOPDD.js";
3
+ } from "./chunk-J4FNYLBF.js";
4
4
  import "./chunk-WFT4JHYI.js";
5
5
  import "./chunk-PKBMQBKP.js";
6
6
  export {
@@ -1,18 +1,20 @@
1
1
  import {
2
2
  mountInspector
3
- } from "./chunk-J67FVPHF.js";
3
+ } from "./chunk-IXYK6ZOY.js";
4
4
  import {
5
5
  registerInspectorCdnShell
6
- } from "./chunk-TPHRVELX.js";
7
- import "./chunk-THQ67TSE.js";
8
- import "./chunk-ESODOPDD.js";
9
- import "./chunk-WFT4JHYI.js";
6
+ } from "./chunk-VDUV6LR6.js";
7
+ import "./chunk-M5TZA42I.js";
8
+ import "./chunk-Y2GBQOQW.js";
9
+ import "./chunk-KBVKS4J5.js";
10
10
  import {
11
11
  registerInspectorProxyRoutes
12
12
  } from "./chunk-5B3SXGZP.js";
13
13
  import "./chunk-IKTZUWSX.js";
14
14
  import "./chunk-6XWDZEFF.js";
15
15
  import "./chunk-K2F2AJOI.js";
16
+ import "./chunk-J4FNYLBF.js";
17
+ import "./chunk-WFT4JHYI.js";
16
18
  import "./chunk-PKBMQBKP.js";
17
19
  export {
18
20
  mountInspector,