mcp-use 1.10.0-canary.2 → 1.10.0-canary.4

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 (76) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{chunk-QREDNTLS.js → chunk-F5MMLHUR.js} +1 -1
  3. package/dist/{chunk-Q3PFK7Y4.js → chunk-L6P6GBCW.js} +3 -2
  4. package/dist/{chunk-ZQUCGISK.js → chunk-LTA4LQTH.js} +6 -4
  5. package/dist/{chunk-HRWL2M2I.js → chunk-QBTQXCAI.js} +1 -1
  6. package/dist/{chunk-BFFS67JY.js → chunk-VPHP7ERH.js} +18 -9
  7. package/dist/{chunk-U5BX3ISQ.js → chunk-YMJL66MY.js} +10 -6
  8. package/dist/index.cjs +36 -20
  9. package/dist/index.js +9 -8
  10. package/dist/src/agents/index.cjs +10 -6
  11. package/dist/src/agents/index.js +3 -3
  12. package/dist/src/agents/mcp_agent.d.ts.map +1 -1
  13. package/dist/src/browser.cjs +16 -10
  14. package/dist/src/browser.js +3 -3
  15. package/dist/src/client/prompts.js +2 -2
  16. package/dist/src/connectors/base.d.ts +2 -2
  17. package/dist/src/connectors/base.d.ts.map +1 -1
  18. package/dist/src/oauth-helper.d.ts.map +1 -1
  19. package/dist/src/react/WidgetControls.d.ts.map +1 -1
  20. package/dist/src/react/index.cjs +23 -12
  21. package/dist/src/react/index.js +3 -3
  22. package/dist/src/react/useMcp.d.ts.map +1 -1
  23. package/dist/src/server/endpoints/mount-mcp.d.ts +4 -1
  24. package/dist/src/server/endpoints/mount-mcp.d.ts.map +1 -1
  25. package/dist/src/server/index.cjs +237 -168
  26. package/dist/src/server/index.js +238 -170
  27. package/dist/src/server/mcp-server.d.ts +28 -13
  28. package/dist/src/server/mcp-server.d.ts.map +1 -1
  29. package/dist/src/server/oauth/middleware.d.ts.map +1 -1
  30. package/dist/src/server/oauth/providers/auth0.d.ts +1 -1
  31. package/dist/src/server/oauth/providers/auth0.d.ts.map +1 -1
  32. package/dist/src/server/oauth/providers/custom.d.ts +4 -2
  33. package/dist/src/server/oauth/providers/custom.d.ts.map +1 -1
  34. package/dist/src/server/oauth/providers/keycloak.d.ts +1 -1
  35. package/dist/src/server/oauth/providers/keycloak.d.ts.map +1 -1
  36. package/dist/src/server/oauth/providers/supabase.d.ts +1 -1
  37. package/dist/src/server/oauth/providers/supabase.d.ts.map +1 -1
  38. package/dist/src/server/oauth/providers/types.d.ts +9 -5
  39. package/dist/src/server/oauth/providers/types.d.ts.map +1 -1
  40. package/dist/src/server/oauth/setup.d.ts +5 -4
  41. package/dist/src/server/oauth/setup.d.ts.map +1 -1
  42. package/dist/src/server/oauth/utils.d.ts +3 -2
  43. package/dist/src/server/oauth/utils.d.ts.map +1 -1
  44. package/dist/src/server/prompts/index.d.ts +5 -4
  45. package/dist/src/server/prompts/index.d.ts.map +1 -1
  46. package/dist/src/server/resources/index.d.ts +1 -1
  47. package/dist/src/server/resources/index.d.ts.map +1 -1
  48. package/dist/src/server/sessions/session-manager.d.ts +10 -6
  49. package/dist/src/server/sessions/session-manager.d.ts.map +1 -1
  50. package/dist/src/server/tools/tool-execution-helpers.d.ts +30 -7
  51. package/dist/src/server/tools/tool-execution-helpers.d.ts.map +1 -1
  52. package/dist/src/server/tools/tool-registration.d.ts +21 -7
  53. package/dist/src/server/tools/tool-registration.d.ts.map +1 -1
  54. package/dist/src/server/types/common.d.ts +1 -1
  55. package/dist/src/server/types/common.d.ts.map +1 -1
  56. package/dist/src/server/types/resource.d.ts +6 -1
  57. package/dist/src/server/types/resource.d.ts.map +1 -1
  58. package/dist/src/server/types/tool.d.ts +41 -0
  59. package/dist/src/server/types/tool.d.ts.map +1 -1
  60. package/dist/src/server/types/widget.d.ts +11 -1
  61. package/dist/src/server/types/widget.d.ts.map +1 -1
  62. package/dist/src/server/utils/response-helpers.d.ts +16 -28
  63. package/dist/src/server/utils/response-helpers.d.ts.map +1 -1
  64. package/dist/src/server/widgets/index.d.ts +1 -1
  65. package/dist/src/server/widgets/index.d.ts.map +1 -1
  66. package/dist/src/server/widgets/mount-widgets-dev.d.ts.map +1 -1
  67. package/dist/src/server/widgets/ui-resource-registration.d.ts +13 -25
  68. package/dist/src/server/widgets/ui-resource-registration.d.ts.map +1 -1
  69. package/dist/src/server/widgets/widget-helpers.d.ts +11 -6
  70. package/dist/src/server/widgets/widget-helpers.d.ts.map +1 -1
  71. package/dist/src/server/widgets/widget-types.d.ts +3 -3
  72. package/dist/src/server/widgets/widget-types.d.ts.map +1 -1
  73. package/dist/src/session.d.ts +1 -1
  74. package/dist/src/session.d.ts.map +1 -1
  75. package/dist/{tool-execution-helpers-RRMGLAHR.js → tool-execution-helpers-2LGVSS7L.js} +1 -1
  76. package/package.json +3 -3
@@ -403,9 +403,10 @@ function createElicitMethod(elicitInput) {
403
403
  data: validatedData
404
404
  };
405
405
  } catch (error2) {
406
+ const err = error2;
406
407
  throw new ElicitationValidationError(
407
- `Elicitation data validation failed: ${error2.message}`,
408
- error2
408
+ `Elicitation data validation failed: ${err.message}`,
409
+ err
409
410
  );
410
411
  }
411
412
  }
@@ -1107,37 +1108,12 @@ function binary(base64Data, mimeType) {
1107
1108
  }
1108
1109
  __name(binary, "binary");
1109
1110
  function widget(config) {
1110
- const {
1111
- name,
1112
- data,
1113
- message,
1114
- invoking,
1115
- invoked,
1116
- widgetAccessible = true,
1117
- resultCanProduceWidget = true,
1118
- buildId
1119
- } = config;
1120
- const randomId = Math.random().toString(36).substring(2, 15);
1121
- const buildIdPart = buildId ? `-${buildId}` : "";
1122
- const uniqueUri = `ui://widget/${name}${buildIdPart}-${randomId}.html`;
1123
- const metadata = {
1124
- "openai/outputTemplate": uniqueUri,
1125
- "openai/widgetAccessible": widgetAccessible,
1126
- "openai/resultCanProduceWidget": resultCanProduceWidget
1127
- };
1128
- if (invoking) {
1129
- metadata["openai/toolInvocation/invoking"] = invoking;
1130
- }
1131
- if (invoked) {
1132
- metadata["openai/toolInvocation/invoked"] = invoked;
1133
- }
1134
- const displayMessage = message || `Displaying ${name}`;
1111
+ const { data, message } = config;
1135
1112
  return {
1136
- _meta: metadata,
1137
1113
  content: [
1138
1114
  {
1139
1115
  type: "text",
1140
- text: displayMessage
1116
+ text: message || ""
1141
1117
  }
1142
1118
  ],
1143
1119
  // structuredContent will be injected as window.openai.toolOutput by Apps SDK
@@ -1815,6 +1791,7 @@ function createWidgetRegistration(widgetName, metadata, html2, serverConfig, isD
1815
1791
  const props = metadata.inputs || {};
1816
1792
  const description = metadata.description || `Widget: ${widgetName}`;
1817
1793
  const title = metadata.title || widgetName;
1794
+ const exposeAsTool = metadata.exposeAsTool !== void 0 ? metadata.exposeAsTool : true;
1818
1795
  const mcp_connect_domain = serverConfig.serverBaseUrl ? new URL(serverConfig.serverBaseUrl || "").origin : null;
1819
1796
  return {
1820
1797
  name: widgetName,
@@ -1830,7 +1807,8 @@ function createWidgetRegistration(widgetName, metadata, html2, serverConfig, isD
1830
1807
  type: "appsSdk",
1831
1808
  props,
1832
1809
  html: html2,
1833
- dev: isDev
1810
+ dev: isDev,
1811
+ exposeAsTool
1834
1812
  },
1835
1813
  ...metadata._meta || {}
1836
1814
  },
@@ -2398,25 +2376,31 @@ function setupWidgetRoutes(app, serverConfig) {
2398
2376
  __name(setupWidgetRoutes, "setupWidgetRoutes");
2399
2377
 
2400
2378
  // src/server/widgets/ui-resource-registration.ts
2401
- function uiResourceRegistration(definition) {
2379
+ function uiResourceRegistration(server, definition) {
2402
2380
  const displayName = definition.title || definition.name;
2381
+ if (definition.type === "appsSdk" && definition._meta) {
2382
+ server.widgetDefinitions.set(
2383
+ definition.name,
2384
+ definition._meta
2385
+ );
2386
+ }
2403
2387
  let resourceUri;
2404
2388
  let mimeType;
2405
2389
  switch (definition.type) {
2406
2390
  case "externalUrl":
2407
- resourceUri = generateWidgetUri(definition.widget, this.buildId);
2391
+ resourceUri = generateWidgetUri(definition.widget, server.buildId);
2408
2392
  mimeType = "text/uri-list";
2409
2393
  break;
2410
2394
  case "rawHtml":
2411
- resourceUri = generateWidgetUri(definition.name, this.buildId);
2395
+ resourceUri = generateWidgetUri(definition.name, server.buildId);
2412
2396
  mimeType = "text/html";
2413
2397
  break;
2414
2398
  case "remoteDom":
2415
- resourceUri = generateWidgetUri(definition.name, this.buildId);
2399
+ resourceUri = generateWidgetUri(definition.name, server.buildId);
2416
2400
  mimeType = "application/vnd.mcp-ui.remote-dom+javascript";
2417
2401
  break;
2418
2402
  case "appsSdk":
2419
- resourceUri = generateWidgetUri(definition.name, this.buildId, ".html");
2403
+ resourceUri = generateWidgetUri(definition.name, server.buildId, ".html");
2420
2404
  mimeType = "text/html+skybridge";
2421
2405
  break;
2422
2406
  default:
@@ -2425,12 +2409,12 @@ function uiResourceRegistration(definition) {
2425
2409
  );
2426
2410
  }
2427
2411
  const serverConfig = {
2428
- serverHost: this.serverHost,
2429
- serverPort: this.serverPort || 3e3,
2430
- serverBaseUrl: this.serverBaseUrl,
2431
- buildId: this.buildId
2412
+ serverHost: server.serverHost,
2413
+ serverPort: server.serverPort || 3e3,
2414
+ serverBaseUrl: server.serverBaseUrl,
2415
+ buildId: server.buildId
2432
2416
  };
2433
- this.resource({
2417
+ server.resource({
2434
2418
  name: definition.name,
2435
2419
  uri: resourceUri,
2436
2420
  title: definition.title,
@@ -2452,9 +2436,9 @@ function uiResourceRegistration(definition) {
2452
2436
  }, "readCallback")
2453
2437
  });
2454
2438
  if (definition.type === "appsSdk") {
2455
- const buildIdPart = this.buildId ? `-${this.buildId}` : "";
2439
+ const buildIdPart = server.buildId ? `-${server.buildId}` : "";
2456
2440
  const uriTemplate = `ui://widget/${definition.name}${buildIdPart}-{id}.html`;
2457
- this.resourceTemplate({
2441
+ server.resourceTemplate({
2458
2442
  name: `${definition.name}-dynamic`,
2459
2443
  resourceTemplate: {
2460
2444
  uriTemplate,
@@ -2479,70 +2463,77 @@ function uiResourceRegistration(definition) {
2479
2463
  }, "readCallback")
2480
2464
  });
2481
2465
  }
2482
- const toolMetadata = definition._meta || {};
2483
- if (definition.type === "appsSdk" && definition.appsSdkMetadata) {
2484
- toolMetadata["openai/outputTemplate"] = resourceUri;
2485
- const toolMetadataFields = [
2486
- "openai/toolInvocation/invoking",
2487
- "openai/toolInvocation/invoked",
2488
- "openai/widgetAccessible",
2489
- "openai/resultCanProduceWidget"
2490
- ];
2491
- for (const field of toolMetadataFields) {
2492
- if (definition.appsSdkMetadata[field] !== void 0) {
2493
- toolMetadata[field] = definition.appsSdkMetadata[field];
2466
+ const widgetMetadata = definition._meta?.["mcp-use/widget"];
2467
+ const exposeAsTool = definition.exposeAsTool ?? widgetMetadata?.exposeAsTool ?? true;
2468
+ if (exposeAsTool) {
2469
+ const toolMetadata = definition._meta || {};
2470
+ if (definition.type === "appsSdk" && definition.appsSdkMetadata) {
2471
+ toolMetadata["openai/outputTemplate"] = resourceUri;
2472
+ const toolMetadataFields = [
2473
+ "openai/toolInvocation/invoking",
2474
+ "openai/toolInvocation/invoked",
2475
+ "openai/widgetAccessible",
2476
+ "openai/resultCanProduceWidget"
2477
+ ];
2478
+ for (const field of toolMetadataFields) {
2479
+ if (definition.appsSdkMetadata[field] !== void 0) {
2480
+ toolMetadata[field] = definition.appsSdkMetadata[field];
2481
+ }
2494
2482
  }
2495
2483
  }
2496
- }
2497
- this.tool({
2498
- name: definition.name,
2499
- title: definition.title,
2500
- description: definition.description,
2501
- inputs: convertPropsToInputs(definition.props),
2502
- _meta: Object.keys(toolMetadata).length > 0 ? toolMetadata : void 0,
2503
- cb: /* @__PURE__ */ __name(async (params) => {
2504
- const uiResource = await createWidgetUIResource(
2505
- definition,
2506
- params,
2507
- serverConfig
2508
- );
2509
- if (definition.type === "appsSdk") {
2510
- const randomId = Math.random().toString(36).substring(2, 15);
2511
- const uniqueUri = generateWidgetUri(
2512
- definition.name,
2513
- this.buildId,
2514
- ".html",
2515
- randomId
2484
+ server.tool(
2485
+ {
2486
+ name: definition.name,
2487
+ title: definition.title,
2488
+ description: definition.description,
2489
+ inputs: convertPropsToInputs(definition.props),
2490
+ annotations: definition.toolAnnotations,
2491
+ _meta: Object.keys(toolMetadata).length > 0 ? toolMetadata : void 0
2492
+ },
2493
+ async (params) => {
2494
+ const uiResource = await createWidgetUIResource(
2495
+ definition,
2496
+ params,
2497
+ serverConfig
2516
2498
  );
2517
- const uniqueToolMetadata = {
2518
- ...toolMetadata,
2519
- "openai/outputTemplate": uniqueUri
2520
- };
2499
+ if (definition.type === "appsSdk") {
2500
+ const randomId = Math.random().toString(36).substring(2, 15);
2501
+ const uniqueUri = generateWidgetUri(
2502
+ definition.name,
2503
+ server.buildId,
2504
+ ".html",
2505
+ randomId
2506
+ );
2507
+ const uniqueToolMetadata = {
2508
+ ...toolMetadata,
2509
+ "openai/outputTemplate": uniqueUri
2510
+ };
2511
+ return {
2512
+ _meta: uniqueToolMetadata,
2513
+ content: [
2514
+ {
2515
+ type: "text",
2516
+ text: `Displaying ${displayName}`
2517
+ }
2518
+ ],
2519
+ // structuredContent will be injected as window.openai.toolOutput by Apps SDK
2520
+ structuredContent: params
2521
+ };
2522
+ }
2521
2523
  return {
2522
- _meta: uniqueToolMetadata,
2523
2524
  content: [
2524
2525
  {
2525
2526
  type: "text",
2526
- text: `Displaying ${displayName}`
2527
- }
2528
- ],
2529
- // structuredContent will be injected as window.openai.toolOutput by Apps SDK
2530
- structuredContent: params
2527
+ text: `Displaying ${displayName}`,
2528
+ description: `Show MCP-UI widget for ${displayName}`
2529
+ },
2530
+ uiResource
2531
+ ]
2531
2532
  };
2532
2533
  }
2533
- return {
2534
- content: [
2535
- {
2536
- type: "text",
2537
- text: `Displaying ${displayName}`,
2538
- description: `Show MCP-UI widget for ${displayName}`
2539
- },
2540
- uiResource
2541
- ]
2542
- };
2543
- }, "cb")
2544
- });
2545
- return this;
2534
+ );
2535
+ }
2536
+ return server;
2546
2537
  }
2547
2538
  __name(uiResourceRegistration, "uiResourceRegistration");
2548
2539
 
@@ -3605,12 +3596,13 @@ function createBearerAuthMiddleware(provider, baseUrl) {
3605
3596
  const result = await provider.verifyToken(token);
3606
3597
  const payload = result.payload;
3607
3598
  const user = provider.getUserInfo(payload);
3599
+ const scope = payload.scope;
3608
3600
  const authInfo = {
3609
3601
  user,
3610
3602
  payload,
3611
3603
  accessToken: token,
3612
3604
  // Extract scopes from scope claim (OAuth standard)
3613
- scopes: payload.scope ? payload.scope.split(" ") : [],
3605
+ scopes: scope ? scope.split(" ") : [],
3614
3606
  // Extract permissions (Auth0 style, or custom)
3615
3607
  permissions: payload.permissions || []
3616
3608
  };
@@ -3658,9 +3650,9 @@ async function setupOAuthForServer(app, oauthProvider, baseUrl, state) {
3658
3650
  __name(setupOAuthForServer, "setupOAuthForServer");
3659
3651
 
3660
3652
  // src/server/mcp-server.ts
3661
- var MCPServer = class {
3653
+ var MCPServerClass = class {
3662
3654
  static {
3663
- __name(this, "MCPServer");
3655
+ __name(this, "MCPServerClass");
3664
3656
  }
3665
3657
  /**
3666
3658
  * Native MCP server instance from @modelcontextprotocol/sdk
@@ -3684,8 +3676,6 @@ var MCPServer = class {
3684
3676
  buildId;
3685
3677
  sessions = /* @__PURE__ */ new Map();
3686
3678
  idleCleanupInterval;
3687
- oauthConfig;
3688
- // Store OAuth config for lazy initialization
3689
3679
  oauthSetupState = {
3690
3680
  complete: false,
3691
3681
  provider: void 0,
@@ -3703,6 +3693,11 @@ var MCPServer = class {
3703
3693
  resources: /* @__PURE__ */ new Map(),
3704
3694
  resourceTemplates: /* @__PURE__ */ new Map()
3705
3695
  };
3696
+ /**
3697
+ * Storage for widget definitions, used to inject metadata into tool responses
3698
+ * when using the widget() helper with returnsWidget option
3699
+ */
3700
+ widgetDefinitions = /* @__PURE__ */ new Map();
3706
3701
  /**
3707
3702
  * Resource subscription manager for tracking and notifying resource updates
3708
3703
  */
@@ -3749,7 +3744,7 @@ var MCPServer = class {
3749
3744
  }
3750
3745
  );
3751
3746
  this.app = createHonoApp(requestLogger);
3752
- this.oauthConfig = config.oauth;
3747
+ this.oauthProvider = config.oauth;
3753
3748
  this.wrapRegistrationMethods();
3754
3749
  return createHonoProxy(this, this.app);
3755
3750
  }
@@ -3764,38 +3759,97 @@ var MCPServer = class {
3764
3759
  const originalResourceTemplate = registerResourceTemplate;
3765
3760
  const self = this;
3766
3761
  this.tool = ((toolDefinition, callback) => {
3767
- const actualCallback = callback || toolDefinition.cb;
3768
- self.registrationRecipes.tools.set(toolDefinition.name, {
3769
- config: toolDefinition,
3770
- handler: actualCallback
3771
- });
3772
- return originalTool.call(self, toolDefinition, callback);
3762
+ const widgetConfig = toolDefinition.widget;
3763
+ const widgetName = widgetConfig?.name;
3764
+ if (widgetConfig && widgetName) {
3765
+ const buildIdPart = self.buildId ? `-${self.buildId}` : "";
3766
+ const outputTemplate = `ui://widget/${widgetName}${buildIdPart}.html`;
3767
+ toolDefinition._meta = {
3768
+ ...toolDefinition._meta,
3769
+ "openai/outputTemplate": outputTemplate,
3770
+ "openai/toolInvocation/invoking": widgetConfig.invoking ?? `Loading ${widgetName}...`,
3771
+ "openai/toolInvocation/invoked": widgetConfig.invoked ?? `${widgetName} ready`,
3772
+ "openai/widgetAccessible": widgetConfig.widgetAccessible ?? true,
3773
+ "openai/resultCanProduceWidget": widgetConfig.resultCanProduceWidget ?? true
3774
+ };
3775
+ }
3776
+ let actualCallback = callback || toolDefinition.cb;
3777
+ if (widgetConfig && widgetName && actualCallback) {
3778
+ const originalCallback = actualCallback;
3779
+ actualCallback = /* @__PURE__ */ __name((async (params, ctx) => {
3780
+ const result = await originalCallback(params, ctx);
3781
+ const widgetDef = self.widgetDefinitions.get(widgetName);
3782
+ if (result && typeof result === "object") {
3783
+ const randomId = Math.random().toString(36).substring(2, 15);
3784
+ const buildIdPart = self.buildId ? `-${self.buildId}` : "";
3785
+ const uniqueUri = `ui://widget/${widgetName}${buildIdPart}-${randomId}.html`;
3786
+ const responseMeta = {
3787
+ ...widgetDef || {},
3788
+ // Include mcp-use/widget and other widget metadata
3789
+ "openai/outputTemplate": uniqueUri,
3790
+ "openai/toolInvocation/invoking": widgetConfig.invoking ?? `Loading ${widgetName}...`,
3791
+ "openai/toolInvocation/invoked": widgetConfig.invoked ?? `${widgetName} ready`,
3792
+ "openai/widgetAccessible": widgetConfig.widgetAccessible ?? true,
3793
+ "openai/resultCanProduceWidget": widgetConfig.resultCanProduceWidget ?? true
3794
+ };
3795
+ result._meta = responseMeta;
3796
+ if (result.content?.[0]?.type === "text" && !result.content[0].text) {
3797
+ result.content[0].text = `Displaying ${widgetName}`;
3798
+ }
3799
+ }
3800
+ return result;
3801
+ }), "actualCallback");
3802
+ }
3803
+ if (actualCallback) {
3804
+ self.registrationRecipes.tools.set(toolDefinition.name, {
3805
+ config: toolDefinition,
3806
+ handler: actualCallback
3807
+ });
3808
+ }
3809
+ return originalTool.call(self, toolDefinition, actualCallback);
3773
3810
  });
3774
- this.prompt = function(promptDefinition, callback) {
3811
+ this.prompt = ((promptDefinition, callback) => {
3775
3812
  const actualCallback = callback || promptDefinition.cb;
3776
- self.registrationRecipes.prompts.set(promptDefinition.name, {
3777
- config: promptDefinition,
3778
- handler: actualCallback
3779
- });
3780
- return originalPrompt.call(self, promptDefinition, callback);
3781
- };
3782
- this.resource = function(resourceDefinition, callback) {
3813
+ if (actualCallback) {
3814
+ self.registrationRecipes.prompts.set(promptDefinition.name, {
3815
+ config: promptDefinition,
3816
+ handler: actualCallback
3817
+ });
3818
+ }
3819
+ return originalPrompt.call(
3820
+ self,
3821
+ promptDefinition,
3822
+ callback
3823
+ );
3824
+ });
3825
+ this.resource = ((resourceDefinition, callback) => {
3783
3826
  const actualCallback = callback || resourceDefinition.readCallback;
3784
- const resourceKey = `${resourceDefinition.name}:${resourceDefinition.uri}`;
3785
- self.registrationRecipes.resources.set(resourceKey, {
3786
- config: resourceDefinition,
3787
- handler: actualCallback
3788
- });
3827
+ if (actualCallback) {
3828
+ const resourceKey = `${resourceDefinition.name}:${resourceDefinition.uri}`;
3829
+ self.registrationRecipes.resources.set(resourceKey, {
3830
+ config: resourceDefinition,
3831
+ handler: actualCallback
3832
+ });
3833
+ }
3789
3834
  return originalResource.call(self, resourceDefinition, callback);
3790
- };
3791
- this.resourceTemplate = function(templateDefinition, callback) {
3835
+ });
3836
+ this.resourceTemplate = ((templateDefinition, callback) => {
3792
3837
  const actualCallback = callback || templateDefinition.readCallback;
3793
- self.registrationRecipes.resourceTemplates.set(templateDefinition.name, {
3794
- config: templateDefinition,
3795
- handler: actualCallback
3796
- });
3797
- return originalResourceTemplate.call(self, templateDefinition, callback);
3798
- };
3838
+ if (actualCallback) {
3839
+ self.registrationRecipes.resourceTemplates.set(
3840
+ templateDefinition.name,
3841
+ {
3842
+ config: templateDefinition,
3843
+ handler: actualCallback
3844
+ }
3845
+ );
3846
+ }
3847
+ return originalResourceTemplate.call(
3848
+ self,
3849
+ templateDefinition,
3850
+ callback
3851
+ );
3852
+ });
3799
3853
  }
3800
3854
  /**
3801
3855
  * Create a new server instance for a session following official SDK pattern.
@@ -3853,11 +3907,12 @@ var MCPServer = class {
3853
3907
  console.log("[createMessage] Got result successfully");
3854
3908
  return result;
3855
3909
  } catch (err) {
3910
+ const error2 = err;
3856
3911
  console.error(
3857
3912
  "[createMessage] Error:",
3858
- err.message,
3913
+ error2.message,
3859
3914
  "Code:",
3860
- err.code
3915
+ error2.code
3861
3916
  );
3862
3917
  throw err;
3863
3918
  }
@@ -3906,8 +3961,8 @@ var MCPServer = class {
3906
3961
  } else {
3907
3962
  argsSchema = void 0;
3908
3963
  }
3909
- const wrappedHandler = /* @__PURE__ */ __name(async (params) => {
3910
- const result = await handler(params);
3964
+ const wrappedHandler = /* @__PURE__ */ __name(async (params, extra) => {
3965
+ const result = await handler(params, extra);
3911
3966
  if ("messages" in result && Array.isArray(result.messages)) {
3912
3967
  return result;
3913
3968
  }
@@ -3926,8 +3981,8 @@ var MCPServer = class {
3926
3981
  }
3927
3982
  for (const [_key, recipe] of this.registrationRecipes.resources) {
3928
3983
  const { config, handler } = recipe;
3929
- const wrappedHandler = /* @__PURE__ */ __name(async () => {
3930
- const result = await handler();
3984
+ const wrappedHandler = /* @__PURE__ */ __name(async (extra) => {
3985
+ const result = await handler(extra);
3931
3986
  if ("contents" in result && Array.isArray(result.contents)) {
3932
3987
  return result;
3933
3988
  }
@@ -3972,20 +4027,23 @@ var MCPServer = class {
3972
4027
  config.name,
3973
4028
  template,
3974
4029
  metadata,
3975
- async (uri) => {
4030
+ async (uri, extra) => {
3976
4031
  const params = this.parseTemplateUri(uriTemplate, uri.toString());
3977
- const result = await handler(uri, params);
4032
+ const result = await handler(uri, params, extra);
3978
4033
  if ("contents" in result && Array.isArray(result.contents)) {
3979
4034
  return result;
3980
4035
  }
3981
4036
  const { convertToolResultToResourceResult: convertToolResultToResourceResult2 } = await Promise.resolve().then(() => (init_conversion(), conversion_exports));
3982
- return convertToolResultToResourceResult2(uri.toString(), result);
4037
+ return convertToolResultToResourceResult2(
4038
+ uri.toString(),
4039
+ result
4040
+ );
3983
4041
  }
3984
4042
  );
3985
4043
  }
3986
4044
  newServer.server.setRequestHandler(
3987
4045
  import_zod2.z.object({ method: import_zod2.z.literal("logging/setLevel") }).passthrough(),
3988
- async (request) => {
4046
+ (async (request, extra) => {
3989
4047
  const level = request.params?.level;
3990
4048
  if (!level) {
3991
4049
  throw new import_types2.McpError(
@@ -4024,7 +4082,7 @@ var MCPServer = class {
4024
4082
  "[MCP] Could not find session for logging/setLevel request"
4025
4083
  );
4026
4084
  throw new import_types2.McpError(import_types2.ErrorCode.InternalError, "Could not find session");
4027
- }
4085
+ })
4028
4086
  );
4029
4087
  this.subscriptionManager.registerHandlers(newServer, this.sessions);
4030
4088
  return newServer;
@@ -4040,18 +4098,18 @@ var MCPServer = class {
4040
4098
  this.serverPort
4041
4099
  );
4042
4100
  }
4043
- // Tool registration helper
4044
- tool = toolRegistration;
4101
+ // Tool registration helper - type is set in wrapRegistrationMethods
4102
+ tool;
4045
4103
  // Schema conversion helpers (used by tool registration)
4046
4104
  convertZodSchemaToParams = convertZodSchemaToParams;
4047
4105
  createParamsSchema = createParamsSchema;
4048
4106
  // Template URI parsing helper (used by resource templates)
4049
4107
  parseTemplateUri = parseTemplateUri;
4050
- // Resource registration helpers
4051
- resource = registerResource;
4052
- resourceTemplate = registerResourceTemplate;
4053
- // Prompt registration helper
4054
- prompt = registerPrompt;
4108
+ // Resource registration helpers - types are set in wrapRegistrationMethods
4109
+ resource;
4110
+ resourceTemplate;
4111
+ // Prompt registration helper - type is set in wrapRegistrationMethods
4112
+ prompt;
4055
4113
  // Notification helpers
4056
4114
  getActiveSessions = getActiveSessions;
4057
4115
  sendNotification = sendNotification;
@@ -4074,7 +4132,9 @@ var MCPServer = class {
4074
4132
  async notifyResourceUpdated(uri) {
4075
4133
  return this.subscriptionManager.notifyResourceUpdated(uri, this.sessions);
4076
4134
  }
4077
- uiResource = uiResourceRegistration;
4135
+ uiResource = /* @__PURE__ */ __name((definition) => {
4136
+ return uiResourceRegistration(this, definition);
4137
+ }, "uiResource");
4078
4138
  /**
4079
4139
  * Mount MCP server endpoints at /mcp and /sse
4080
4140
  *
@@ -4162,7 +4222,7 @@ var MCPServer = class {
4162
4222
  this.serverHost,
4163
4223
  this.serverPort
4164
4224
  );
4165
- if (this.oauthConfig && !this.oauthSetupState.complete) {
4225
+ if (this.oauthProvider && !this.oauthSetupState.complete) {
4166
4226
  await setupOAuthForServer(
4167
4227
  this.app,
4168
4228
  this.oauthProvider,
@@ -4215,7 +4275,7 @@ var MCPServer = class {
4215
4275
  * ```
4216
4276
  */
4217
4277
  async getHandler(options) {
4218
- if (this.oauthConfig && !this.oauthSetupState.complete) {
4278
+ if (this.oauthProvider && !this.oauthSetupState.complete) {
4219
4279
  await setupOAuthForServer(
4220
4280
  this.app,
4221
4281
  this.oauthProvider,
@@ -4285,8 +4345,9 @@ var MCPServer = class {
4285
4345
  }
4286
4346
  }
4287
4347
  };
4348
+ var MCPServer = MCPServerClass;
4288
4349
  function createMCPServer(name, config = {}) {
4289
- const instance = new MCPServer({
4350
+ const instance = new MCPServerClass({
4290
4351
  name,
4291
4352
  version: config.version || "1.0.0",
4292
4353
  description: config.description,
@@ -4368,12 +4429,13 @@ var SupabaseOAuthProvider = class {
4368
4429
  }
4369
4430
  }
4370
4431
  getUserInfo(payload) {
4432
+ const userMetadata = payload.user_metadata;
4371
4433
  return {
4372
4434
  userId: payload.sub || payload.user_id,
4373
4435
  email: payload.email,
4374
- name: payload.user_metadata?.name || payload.user_metadata?.full_name,
4375
- username: payload.user_metadata?.username,
4376
- picture: payload.user_metadata?.avatar_url,
4436
+ name: userMetadata?.name || userMetadata?.full_name,
4437
+ username: userMetadata?.username,
4438
+ picture: userMetadata?.avatar_url,
4377
4439
  roles: payload.role ? [payload.role] : [],
4378
4440
  permissions: payload.aal ? [`aal:${payload.aal}`] : [],
4379
4441
  // Include Supabase-specific claims
@@ -4446,6 +4508,7 @@ var Auth0OAuthProvider = class {
4446
4508
  }
4447
4509
  }
4448
4510
  getUserInfo(payload) {
4511
+ const scope = payload.scope;
4449
4512
  return {
4450
4513
  userId: payload.sub,
4451
4514
  email: payload.email,
@@ -4458,7 +4521,7 @@ var Auth0OAuthProvider = class {
4458
4521
  // Auth0 can include roles (if configured)
4459
4522
  roles: payload.roles || payload["https://your-app.com/roles"] || [],
4460
4523
  // Include scope as well
4461
- scopes: payload.scope ? payload.scope.split(" ") : [],
4524
+ scopes: scope ? scope.split(" ") : [],
4462
4525
  // Additional Auth0-specific claims
4463
4526
  email_verified: payload.email_verified,
4464
4527
  updated_at: payload.updated_at
@@ -4530,8 +4593,10 @@ var KeycloakOAuthProvider = class {
4530
4593
  }
4531
4594
  }
4532
4595
  getUserInfo(payload) {
4533
- const realmRoles = payload.realm_access?.roles || [];
4534
- const clientRoles = this.config.clientId && payload.resource_access?.[this.config.clientId]?.roles || [];
4596
+ const realmAccess = payload.realm_access;
4597
+ const realmRoles = realmAccess?.roles || [];
4598
+ const resourceAccess = payload.resource_access;
4599
+ const clientRoles = this.config.clientId && (resourceAccess?.[this.config.clientId]?.roles || []) || [];
4535
4600
  const allRoles = [...realmRoles, ...clientRoles];
4536
4601
  const permissions = [];
4537
4602
  if (payload.resource_access) {
@@ -4545,6 +4610,7 @@ var KeycloakOAuthProvider = class {
4545
4610
  }
4546
4611
  );
4547
4612
  }
4613
+ const scope = payload.scope;
4548
4614
  return {
4549
4615
  userId: payload.sub,
4550
4616
  email: payload.email,
@@ -4555,7 +4621,7 @@ var KeycloakOAuthProvider = class {
4555
4621
  roles: allRoles,
4556
4622
  permissions,
4557
4623
  // Include scope as well
4558
- scopes: payload.scope ? payload.scope.split(" ") : [],
4624
+ scopes: scope ? scope.split(" ") : [],
4559
4625
  // Keycloak-specific claims
4560
4626
  email_verified: payload.email_verified,
4561
4627
  given_name: payload.given_name,
@@ -4684,7 +4750,7 @@ var CustomOAuthProvider = class {
4684
4750
  async verifyToken(token) {
4685
4751
  try {
4686
4752
  const result = await this.config.verifyToken(token);
4687
- return { payload: result };
4753
+ return result;
4688
4754
  } catch (error2) {
4689
4755
  throw new Error(`Custom OAuth verification failed: ${error2}`);
4690
4756
  }
@@ -4693,16 +4759,19 @@ var CustomOAuthProvider = class {
4693
4759
  if (this.config.getUserInfo) {
4694
4760
  return this.config.getUserInfo(payload);
4695
4761
  }
4762
+ const scope = payload.scope;
4763
+ const roles = payload.roles;
4764
+ const permissions = payload.permissions;
4696
4765
  return {
4697
4766
  userId: payload.sub || payload.user_id || payload.id,
4698
- email: payload.email,
4699
- name: payload.name,
4700
- username: payload.username || payload.preferred_username,
4701
- nickname: payload.nickname,
4702
- picture: payload.picture || payload.avatar_url,
4703
- roles: payload.roles || [],
4704
- permissions: payload.permissions || [],
4705
- scopes: payload.scope ? payload.scope.split(" ") : []
4767
+ email: payload.email ? payload.email : void 0,
4768
+ name: payload.name ? payload.name : void 0,
4769
+ username: payload.username || payload.preferred_username ? payload.username || payload.preferred_username : void 0,
4770
+ nickname: payload.nickname ? payload.nickname : void 0,
4771
+ picture: payload.picture || payload.avatar_url ? payload.picture || payload.avatar_url : void 0,
4772
+ roles: Array.isArray(roles) ? roles : [],
4773
+ permissions: Array.isArray(permissions) ? permissions : [],
4774
+ scopes: scope ? scope.split(" ") : []
4706
4775
  };
4707
4776
  }
4708
4777
  getIssuer() {