mcp-use 1.9.1-canary.1 → 1.10.0-canary.11

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 (145) hide show
  1. package/README.md +9 -6
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/{chunk-QREDNTLS.js → chunk-5S5DWSKI.js} +1 -1
  4. package/dist/{chunk-MUZ5WYE3.js → chunk-5UB2K5L6.js} +72 -14
  5. package/dist/{chunk-33U4IA4N.js → chunk-B5N3LQQU.js} +99 -5
  6. package/dist/{chunk-3R5PDYIN.js → chunk-J75I2C26.js} +39 -11
  7. package/dist/{chunk-U5BX3ISQ.js → chunk-KMTBWOVS.js} +22 -408
  8. package/dist/{chunk-D22NUQTL.js → chunk-LXYUQEEE.js} +235 -12
  9. package/dist/{chunk-ZQUCGISK.js → chunk-NNQUSDFU.js} +21 -5
  10. package/dist/chunk-PESKSVLQ.js +1129 -0
  11. package/dist/index.cjs +1190 -200
  12. package/dist/index.d.ts +6 -4
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +63 -23
  15. package/dist/src/adapters/langchain_adapter.d.ts +1 -1
  16. package/dist/src/adapters/langchain_adapter.d.ts.map +1 -1
  17. package/dist/src/agents/index.cjs +2263 -1626
  18. package/dist/src/agents/index.js +4 -4
  19. package/dist/src/agents/mcp_agent.d.ts +5 -0
  20. package/dist/src/agents/mcp_agent.d.ts.map +1 -1
  21. package/dist/src/auth/browser-provider.d.ts +2 -2
  22. package/dist/src/auth/browser-provider.d.ts.map +1 -1
  23. package/dist/src/auth/callback.d.ts.map +1 -1
  24. package/dist/src/auth/index.cjs +39 -11
  25. package/dist/src/auth/index.js +1 -1
  26. package/dist/src/auth/types.d.ts +1 -1
  27. package/dist/src/auth/types.d.ts.map +1 -1
  28. package/dist/src/browser.cjs +2672 -1754
  29. package/dist/src/browser.d.ts +5 -1
  30. package/dist/src/browser.d.ts.map +1 -1
  31. package/dist/src/browser.js +18 -5
  32. package/dist/src/client/base.d.ts.map +1 -1
  33. package/dist/src/client/browser.d.ts +6 -0
  34. package/dist/src/client/browser.d.ts.map +1 -1
  35. package/dist/src/client/connectors/codeMode.d.ts +1 -1
  36. package/dist/src/client/connectors/codeMode.d.ts.map +1 -1
  37. package/dist/src/client/executors/base.d.ts +1 -1
  38. package/dist/src/client/executors/base.d.ts.map +1 -1
  39. package/dist/src/client/prompts.cjs +4 -1
  40. package/dist/src/client/prompts.js +3 -2
  41. package/dist/src/client.d.ts +7 -1
  42. package/dist/src/client.d.ts.map +1 -1
  43. package/dist/src/connectors/base.d.ts +56 -6
  44. package/dist/src/connectors/base.d.ts.map +1 -1
  45. package/dist/src/connectors/http.d.ts.map +1 -1
  46. package/dist/src/connectors/stdio.d.ts.map +1 -1
  47. package/dist/src/connectors/websocket.d.ts +1 -1
  48. package/dist/src/connectors/websocket.d.ts.map +1 -1
  49. package/dist/src/oauth-helper.d.ts.map +1 -1
  50. package/dist/src/react/WidgetControls.d.ts.map +1 -1
  51. package/dist/src/react/index.cjs +1357 -43
  52. package/dist/src/react/index.d.ts +4 -1
  53. package/dist/src/react/index.d.ts.map +1 -1
  54. package/dist/src/react/index.js +14 -5
  55. package/dist/src/react/types.d.ts +1 -1
  56. package/dist/src/react/types.d.ts.map +1 -1
  57. package/dist/src/react/useMcp.d.ts.map +1 -1
  58. package/dist/src/server/endpoints/mount-mcp.d.ts +4 -1
  59. package/dist/src/server/endpoints/mount-mcp.d.ts.map +1 -1
  60. package/dist/src/server/index.cjs +1923 -287
  61. package/dist/src/server/index.d.ts +3 -2
  62. package/dist/src/server/index.d.ts.map +1 -1
  63. package/dist/src/server/index.js +488 -245
  64. package/dist/src/server/mcp-server.d.ts +77 -27
  65. package/dist/src/server/mcp-server.d.ts.map +1 -1
  66. package/dist/src/server/oauth/middleware.d.ts.map +1 -1
  67. package/dist/src/server/oauth/providers/auth0.d.ts +1 -1
  68. package/dist/src/server/oauth/providers/auth0.d.ts.map +1 -1
  69. package/dist/src/server/oauth/providers/custom.d.ts +4 -2
  70. package/dist/src/server/oauth/providers/custom.d.ts.map +1 -1
  71. package/dist/src/server/oauth/providers/keycloak.d.ts +1 -1
  72. package/dist/src/server/oauth/providers/keycloak.d.ts.map +1 -1
  73. package/dist/src/server/oauth/providers/supabase.d.ts +1 -1
  74. package/dist/src/server/oauth/providers/supabase.d.ts.map +1 -1
  75. package/dist/src/server/oauth/providers/types.d.ts +9 -5
  76. package/dist/src/server/oauth/providers/types.d.ts.map +1 -1
  77. package/dist/src/server/oauth/providers.d.ts +27 -9
  78. package/dist/src/server/oauth/providers.d.ts.map +1 -1
  79. package/dist/src/server/oauth/setup.d.ts +5 -4
  80. package/dist/src/server/oauth/setup.d.ts.map +1 -1
  81. package/dist/src/server/oauth/utils.d.ts +3 -2
  82. package/dist/src/server/oauth/utils.d.ts.map +1 -1
  83. package/dist/src/server/prompts/conversion.d.ts +1 -1
  84. package/dist/src/server/prompts/conversion.d.ts.map +1 -1
  85. package/dist/src/server/prompts/index.d.ts +6 -5
  86. package/dist/src/server/prompts/index.d.ts.map +1 -1
  87. package/dist/src/server/resources/conversion.d.ts +1 -1
  88. package/dist/src/server/resources/conversion.d.ts.map +1 -1
  89. package/dist/src/server/resources/index.d.ts +44 -25
  90. package/dist/src/server/resources/index.d.ts.map +1 -1
  91. package/dist/src/server/resources/subscriptions.d.ts +1 -1
  92. package/dist/src/server/resources/subscriptions.d.ts.map +1 -1
  93. package/dist/src/server/sessions/session-manager.d.ts +11 -5
  94. package/dist/src/server/sessions/session-manager.d.ts.map +1 -1
  95. package/dist/src/server/tools/tool-execution-helpers.d.ts +31 -8
  96. package/dist/src/server/tools/tool-execution-helpers.d.ts.map +1 -1
  97. package/dist/src/server/tools/tool-registration.d.ts +21 -7
  98. package/dist/src/server/tools/tool-registration.d.ts.map +1 -1
  99. package/dist/src/server/types/common.d.ts +25 -9
  100. package/dist/src/server/types/common.d.ts.map +1 -1
  101. package/dist/src/server/types/index.d.ts +3 -3
  102. package/dist/src/server/types/index.d.ts.map +1 -1
  103. package/dist/src/server/types/prompt.d.ts +3 -2
  104. package/dist/src/server/types/prompt.d.ts.map +1 -1
  105. package/dist/src/server/types/resource.d.ts +60 -10
  106. package/dist/src/server/types/resource.d.ts.map +1 -1
  107. package/dist/src/server/types/tool-context.d.ts +116 -1
  108. package/dist/src/server/types/tool-context.d.ts.map +1 -1
  109. package/dist/src/server/types/tool.d.ts +43 -2
  110. package/dist/src/server/types/tool.d.ts.map +1 -1
  111. package/dist/src/server/types/widget.d.ts +11 -1
  112. package/dist/src/server/types/widget.d.ts.map +1 -1
  113. package/dist/src/server/utils/response-helpers.d.ts +17 -29
  114. package/dist/src/server/utils/response-helpers.d.ts.map +1 -1
  115. package/dist/src/server/widgets/index.d.ts +3 -3
  116. package/dist/src/server/widgets/index.d.ts.map +1 -1
  117. package/dist/src/server/widgets/mount-widgets-dev.d.ts.map +1 -1
  118. package/dist/src/server/widgets/ui-resource-registration.d.ts +13 -25
  119. package/dist/src/server/widgets/ui-resource-registration.d.ts.map +1 -1
  120. package/dist/src/server/widgets/widget-helpers.d.ts +11 -6
  121. package/dist/src/server/widgets/widget-helpers.d.ts.map +1 -1
  122. package/dist/src/server/widgets/widget-types.d.ts +3 -3
  123. package/dist/src/server/widgets/widget-types.d.ts.map +1 -1
  124. package/dist/src/session.d.ts +372 -2
  125. package/dist/src/session.d.ts.map +1 -1
  126. package/dist/src/task_managers/sse.d.ts +2 -2
  127. package/dist/src/task_managers/sse.d.ts.map +1 -1
  128. package/dist/src/task_managers/stdio.d.ts +2 -2
  129. package/dist/src/task_managers/stdio.d.ts.map +1 -1
  130. package/dist/src/task_managers/streamable_http.d.ts +2 -2
  131. package/dist/src/task_managers/streamable_http.d.ts.map +1 -1
  132. package/dist/src/telemetry/events.d.ts +247 -0
  133. package/dist/src/telemetry/events.d.ts.map +1 -1
  134. package/dist/src/telemetry/index.d.ts +4 -4
  135. package/dist/src/telemetry/index.d.ts.map +1 -1
  136. package/dist/src/telemetry/telemetry.d.ts +122 -4
  137. package/dist/src/telemetry/telemetry.d.ts.map +1 -1
  138. package/dist/src/telemetry/utils.d.ts +1 -1
  139. package/dist/src/telemetry/utils.d.ts.map +1 -1
  140. package/dist/src/version.d.ts +8 -0
  141. package/dist/src/version.d.ts.map +1 -0
  142. package/dist/{tool-execution-helpers-BQJTPWPN.js → tool-execution-helpers-OOVLOJYH.js} +3 -2
  143. package/dist/tsup.config.d.ts.map +1 -1
  144. package/package.json +7 -5
  145. package/dist/chunk-MTHLLDCX.js +0 -97
@@ -7,7 +7,7 @@ import {
7
7
  createEnhancedContext,
8
8
  findSessionContext,
9
9
  isValidLogLevel
10
- } from "../../chunk-33U4IA4N.js";
10
+ } from "../../chunk-B5N3LQQU.js";
11
11
  import {
12
12
  convertToolResultToResourceResult
13
13
  } from "../../chunk-362PI25Z.js";
@@ -16,13 +16,17 @@ import {
16
16
  } from "../../chunk-2EYAMIT3.js";
17
17
  import "../../chunk-KUEVOU4M.js";
18
18
  import {
19
+ Telemetry,
20
+ VERSION,
19
21
  fsHelpers,
20
22
  generateUUID,
21
23
  getCwd,
22
24
  getEnv,
25
+ getPackageVersion,
23
26
  isDeno,
24
27
  pathHelpers
25
- } from "../../chunk-MTHLLDCX.js";
28
+ } from "../../chunk-PESKSVLQ.js";
29
+ import "../../chunk-34R6SIER.js";
26
30
  import {
27
31
  __name
28
32
  } from "../../chunk-3GQAWCBQ.js";
@@ -31,8 +35,11 @@ import {
31
35
  import {
32
36
  McpServer as OfficialMcpServer,
33
37
  ResourceTemplate as ResourceTemplate2
34
- } from "@modelcontextprotocol/sdk/server/mcp.js";
35
- import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
38
+ } from "@mcp-use/modelcontextprotocol-sdk/server/mcp.js";
39
+ import {
40
+ McpError,
41
+ ErrorCode
42
+ } from "@mcp-use/modelcontextprotocol-sdk/types.js";
36
43
  import { z as z2 } from "zod";
37
44
 
38
45
  // src/server/utils/response-helpers.ts
@@ -307,37 +314,12 @@ function binary(base64Data, mimeType) {
307
314
  }
308
315
  __name(binary, "binary");
309
316
  function widget(config) {
310
- const {
311
- name,
312
- data,
313
- message,
314
- invoking,
315
- invoked,
316
- widgetAccessible = true,
317
- resultCanProduceWidget = true,
318
- buildId
319
- } = config;
320
- const randomId = Math.random().toString(36).substring(2, 15);
321
- const buildIdPart = buildId ? `-${buildId}` : "";
322
- const uniqueUri = `ui://widget/${name}${buildIdPart}-${randomId}.html`;
323
- const metadata = {
324
- "openai/outputTemplate": uniqueUri,
325
- "openai/widgetAccessible": widgetAccessible,
326
- "openai/resultCanProduceWidget": resultCanProduceWidget
327
- };
328
- if (invoking) {
329
- metadata["openai/toolInvocation/invoking"] = invoking;
330
- }
331
- if (invoked) {
332
- metadata["openai/toolInvocation/invoked"] = invoked;
333
- }
334
- const displayMessage = message || `Displaying ${name}`;
317
+ const { data, message } = config;
335
318
  return {
336
- _meta: metadata,
337
319
  content: [
338
320
  {
339
321
  type: "text",
340
- text: displayMessage
322
+ text: message || ""
341
323
  }
342
324
  ],
343
325
  // structuredContent will be injected as window.openai.toolOutput by Apps SDK
@@ -1006,6 +988,7 @@ function createWidgetRegistration(widgetName, metadata, html2, serverConfig, isD
1006
988
  const props = metadata.inputs || {};
1007
989
  const description = metadata.description || `Widget: ${widgetName}`;
1008
990
  const title = metadata.title || widgetName;
991
+ const exposeAsTool = metadata.exposeAsTool !== void 0 ? metadata.exposeAsTool : true;
1009
992
  const mcp_connect_domain = serverConfig.serverBaseUrl ? new URL(serverConfig.serverBaseUrl || "").origin : null;
1010
993
  return {
1011
994
  name: widgetName,
@@ -1021,7 +1004,8 @@ function createWidgetRegistration(widgetName, metadata, html2, serverConfig, isD
1021
1004
  type: "appsSdk",
1022
1005
  props,
1023
1006
  html: html2,
1024
- dev: isDev
1007
+ dev: isDev,
1008
+ exposeAsTool
1025
1009
  },
1026
1010
  ...metadata._meta || {}
1027
1011
  },
@@ -1301,10 +1285,42 @@ if (container && Component) {
1301
1285
  console.log(`[WIDGETS] Watching resources directory: ${resourcesPath}`);
1302
1286
  }
1303
1287
  };
1288
+ const nodeStubsPlugin = {
1289
+ name: "node-stubs",
1290
+ enforce: "pre",
1291
+ resolveId(id) {
1292
+ if (id === "posthog-node" || id.startsWith("posthog-node/")) {
1293
+ return "\0virtual:posthog-node-stub";
1294
+ }
1295
+ return null;
1296
+ },
1297
+ load(id) {
1298
+ if (id === "\0virtual:posthog-node-stub") {
1299
+ return `
1300
+ export class PostHog {
1301
+ constructor() {}
1302
+ capture() {}
1303
+ identify() {}
1304
+ alias() {}
1305
+ flush() { return Promise.resolve(); }
1306
+ shutdown() { return Promise.resolve(); }
1307
+ }
1308
+ export default PostHog;
1309
+ `;
1310
+ }
1311
+ return null;
1312
+ }
1313
+ };
1304
1314
  const viteServer = await createServer({
1305
1315
  root: tempDir,
1306
1316
  base: baseRoute + "/",
1307
- plugins: [ssrCssPlugin, watchResourcesPlugin, tailwindcss(), react()],
1317
+ plugins: [
1318
+ nodeStubsPlugin,
1319
+ ssrCssPlugin,
1320
+ watchResourcesPlugin,
1321
+ tailwindcss(),
1322
+ react()
1323
+ ],
1308
1324
  resolve: {
1309
1325
  alias: {
1310
1326
  "@": pathHelpers.join(getCwd(), resourcesDir)
@@ -1325,12 +1341,15 @@ if (container && Component) {
1325
1341
  // Explicitly tell Vite to watch files outside root
1326
1342
  // This is needed because widget entry files import from resources directory
1327
1343
  optimizeDeps: {
1328
- // Don't optimize dependencies that might change
1329
- exclude: []
1344
+ // Exclude Node.js-only packages from browser bundling
1345
+ // posthog-node is for server-side telemetry and doesn't work in browser
1346
+ exclude: ["posthog-node"]
1330
1347
  },
1331
1348
  ssr: {
1332
1349
  // Force Vite to transform these packages in SSR instead of using external requires
1333
- noExternal: ["@openai/apps-sdk-ui", "react-router"]
1350
+ noExternal: ["@openai/apps-sdk-ui", "react-router"],
1351
+ // Mark Node.js-only packages as external in SSR mode
1352
+ external: ["posthog-node"]
1334
1353
  },
1335
1354
  define: {
1336
1355
  // Define process.env for SSR context
@@ -1587,25 +1606,31 @@ function setupWidgetRoutes(app, serverConfig) {
1587
1606
  __name(setupWidgetRoutes, "setupWidgetRoutes");
1588
1607
 
1589
1608
  // src/server/widgets/ui-resource-registration.ts
1590
- function uiResourceRegistration(definition) {
1609
+ function uiResourceRegistration(server, definition) {
1591
1610
  const displayName = definition.title || definition.name;
1611
+ if (definition.type === "appsSdk" && definition._meta) {
1612
+ server.widgetDefinitions.set(
1613
+ definition.name,
1614
+ definition._meta
1615
+ );
1616
+ }
1592
1617
  let resourceUri;
1593
1618
  let mimeType;
1594
1619
  switch (definition.type) {
1595
1620
  case "externalUrl":
1596
- resourceUri = generateWidgetUri(definition.widget, this.buildId);
1621
+ resourceUri = generateWidgetUri(definition.widget, server.buildId);
1597
1622
  mimeType = "text/uri-list";
1598
1623
  break;
1599
1624
  case "rawHtml":
1600
- resourceUri = generateWidgetUri(definition.name, this.buildId);
1625
+ resourceUri = generateWidgetUri(definition.name, server.buildId);
1601
1626
  mimeType = "text/html";
1602
1627
  break;
1603
1628
  case "remoteDom":
1604
- resourceUri = generateWidgetUri(definition.name, this.buildId);
1629
+ resourceUri = generateWidgetUri(definition.name, server.buildId);
1605
1630
  mimeType = "application/vnd.mcp-ui.remote-dom+javascript";
1606
1631
  break;
1607
1632
  case "appsSdk":
1608
- resourceUri = generateWidgetUri(definition.name, this.buildId, ".html");
1633
+ resourceUri = generateWidgetUri(definition.name, server.buildId, ".html");
1609
1634
  mimeType = "text/html+skybridge";
1610
1635
  break;
1611
1636
  default:
@@ -1614,12 +1639,12 @@ function uiResourceRegistration(definition) {
1614
1639
  );
1615
1640
  }
1616
1641
  const serverConfig = {
1617
- serverHost: this.serverHost,
1618
- serverPort: this.serverPort || 3e3,
1619
- serverBaseUrl: this.serverBaseUrl,
1620
- buildId: this.buildId
1642
+ serverHost: server.serverHost,
1643
+ serverPort: server.serverPort || 3e3,
1644
+ serverBaseUrl: server.serverBaseUrl,
1645
+ buildId: server.buildId
1621
1646
  };
1622
- this.resource({
1647
+ server.resource({
1623
1648
  name: definition.name,
1624
1649
  uri: resourceUri,
1625
1650
  title: definition.title,
@@ -1641,9 +1666,9 @@ function uiResourceRegistration(definition) {
1641
1666
  }, "readCallback")
1642
1667
  });
1643
1668
  if (definition.type === "appsSdk") {
1644
- const buildIdPart = this.buildId ? `-${this.buildId}` : "";
1669
+ const buildIdPart = server.buildId ? `-${server.buildId}` : "";
1645
1670
  const uriTemplate = `ui://widget/${definition.name}${buildIdPart}-{id}.html`;
1646
- this.resourceTemplate({
1671
+ server.resourceTemplate({
1647
1672
  name: `${definition.name}-dynamic`,
1648
1673
  resourceTemplate: {
1649
1674
  uriTemplate,
@@ -1668,70 +1693,77 @@ function uiResourceRegistration(definition) {
1668
1693
  }, "readCallback")
1669
1694
  });
1670
1695
  }
1671
- const toolMetadata = definition._meta || {};
1672
- if (definition.type === "appsSdk" && definition.appsSdkMetadata) {
1673
- toolMetadata["openai/outputTemplate"] = resourceUri;
1674
- const toolMetadataFields = [
1675
- "openai/toolInvocation/invoking",
1676
- "openai/toolInvocation/invoked",
1677
- "openai/widgetAccessible",
1678
- "openai/resultCanProduceWidget"
1679
- ];
1680
- for (const field of toolMetadataFields) {
1681
- if (definition.appsSdkMetadata[field] !== void 0) {
1682
- toolMetadata[field] = definition.appsSdkMetadata[field];
1696
+ const widgetMetadata = definition._meta?.["mcp-use/widget"];
1697
+ const exposeAsTool = definition.exposeAsTool ?? widgetMetadata?.exposeAsTool ?? true;
1698
+ if (exposeAsTool) {
1699
+ const toolMetadata = definition._meta || {};
1700
+ if (definition.type === "appsSdk" && definition.appsSdkMetadata) {
1701
+ toolMetadata["openai/outputTemplate"] = resourceUri;
1702
+ const toolMetadataFields = [
1703
+ "openai/toolInvocation/invoking",
1704
+ "openai/toolInvocation/invoked",
1705
+ "openai/widgetAccessible",
1706
+ "openai/resultCanProduceWidget"
1707
+ ];
1708
+ for (const field of toolMetadataFields) {
1709
+ if (definition.appsSdkMetadata[field] !== void 0) {
1710
+ toolMetadata[field] = definition.appsSdkMetadata[field];
1711
+ }
1683
1712
  }
1684
1713
  }
1685
- }
1686
- this.tool({
1687
- name: definition.name,
1688
- title: definition.title,
1689
- description: definition.description,
1690
- inputs: convertPropsToInputs(definition.props),
1691
- _meta: Object.keys(toolMetadata).length > 0 ? toolMetadata : void 0,
1692
- cb: /* @__PURE__ */ __name(async (params) => {
1693
- const uiResource = await createWidgetUIResource(
1694
- definition,
1695
- params,
1696
- serverConfig
1697
- );
1698
- if (definition.type === "appsSdk") {
1699
- const randomId = Math.random().toString(36).substring(2, 15);
1700
- const uniqueUri = generateWidgetUri(
1701
- definition.name,
1702
- this.buildId,
1703
- ".html",
1704
- randomId
1714
+ server.tool(
1715
+ {
1716
+ name: definition.name,
1717
+ title: definition.title,
1718
+ description: definition.description,
1719
+ inputs: convertPropsToInputs(definition.props),
1720
+ annotations: definition.toolAnnotations,
1721
+ _meta: Object.keys(toolMetadata).length > 0 ? toolMetadata : void 0
1722
+ },
1723
+ async (params) => {
1724
+ const uiResource = await createWidgetUIResource(
1725
+ definition,
1726
+ params,
1727
+ serverConfig
1705
1728
  );
1706
- const uniqueToolMetadata = {
1707
- ...toolMetadata,
1708
- "openai/outputTemplate": uniqueUri
1709
- };
1729
+ if (definition.type === "appsSdk") {
1730
+ const randomId = Math.random().toString(36).substring(2, 15);
1731
+ const uniqueUri = generateWidgetUri(
1732
+ definition.name,
1733
+ server.buildId,
1734
+ ".html",
1735
+ randomId
1736
+ );
1737
+ const uniqueToolMetadata = {
1738
+ ...toolMetadata,
1739
+ "openai/outputTemplate": uniqueUri
1740
+ };
1741
+ return {
1742
+ _meta: uniqueToolMetadata,
1743
+ content: [
1744
+ {
1745
+ type: "text",
1746
+ text: `Displaying ${displayName}`
1747
+ }
1748
+ ],
1749
+ // structuredContent will be injected as window.openai.toolOutput by Apps SDK
1750
+ structuredContent: params
1751
+ };
1752
+ }
1710
1753
  return {
1711
- _meta: uniqueToolMetadata,
1712
1754
  content: [
1713
1755
  {
1714
1756
  type: "text",
1715
- text: `Displaying ${displayName}`
1716
- }
1717
- ],
1718
- // structuredContent will be injected as window.openai.toolOutput by Apps SDK
1719
- structuredContent: params
1757
+ text: `Displaying ${displayName}`,
1758
+ description: `Show MCP-UI widget for ${displayName}`
1759
+ },
1760
+ uiResource
1761
+ ]
1720
1762
  };
1721
1763
  }
1722
- return {
1723
- content: [
1724
- {
1725
- type: "text",
1726
- text: `Displaying ${displayName}`,
1727
- description: `Show MCP-UI widget for ${displayName}`
1728
- },
1729
- uiResource
1730
- ]
1731
- };
1732
- }, "cb")
1733
- });
1734
- return this;
1764
+ );
1765
+ }
1766
+ return server;
1735
1767
  }
1736
1768
  __name(uiResourceRegistration, "uiResourceRegistration");
1737
1769
 
@@ -1867,7 +1899,7 @@ function toolRegistration(toolDefinition, callback) {
1867
1899
  const initialRequestContext = getRequestContext();
1868
1900
  const extraProgressToken = extra?._meta?.progressToken;
1869
1901
  const extraSendNotification = extra?.sendNotification;
1870
- const { requestContext, progressToken, sendNotification: sendNotification2 } = findSessionContext(
1902
+ const { requestContext, session, progressToken, sendNotification: sendNotification2 } = findSessionContext(
1871
1903
  this.sessions,
1872
1904
  initialRequestContext,
1873
1905
  extraProgressToken,
@@ -1878,7 +1910,9 @@ function toolRegistration(toolDefinition, callback) {
1878
1910
  this.createMessage.bind(this),
1879
1911
  this.server.server.elicitInput.bind(this.server.server),
1880
1912
  progressToken,
1881
- sendNotification2
1913
+ sendNotification2,
1914
+ session?.logLevel,
1915
+ session?.clientCapabilities
1882
1916
  );
1883
1917
  const executeCallback = /* @__PURE__ */ __name(async () => {
1884
1918
  if (actualCallback.length >= 2) {
@@ -1898,13 +1932,13 @@ function toolRegistration(toolDefinition, callback) {
1898
1932
  __name(toolRegistration, "toolRegistration");
1899
1933
 
1900
1934
  // src/server/resources/index.ts
1901
- import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
1935
+ import { ResourceTemplate } from "@mcp-use/modelcontextprotocol-sdk/server/mcp.js";
1902
1936
 
1903
1937
  // src/server/resources/subscriptions.ts
1904
1938
  import {
1905
1939
  SubscribeRequestSchema,
1906
1940
  UnsubscribeRequestSchema
1907
- } from "@modelcontextprotocol/sdk/types.js";
1941
+ } from "@mcp-use/modelcontextprotocol-sdk/types.js";
1908
1942
  var ResourceSubscriptionManager = class {
1909
1943
  static {
1910
1944
  __name(this, "ResourceSubscriptionManager");
@@ -2057,7 +2091,7 @@ function registerResource(resourceDefinition, callback) {
2057
2091
  const explicitMimeType = resourceDefinition.mimeType;
2058
2092
  const wrappedCallback = /* @__PURE__ */ __name(async () => {
2059
2093
  const { getRequestContext: getRequestContext2, runWithContext: runWithContext2 } = await import("../../context-storage-NA4MHWOZ.js");
2060
- const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-BQJTPWPN.js");
2094
+ const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-OOVLOJYH.js");
2061
2095
  const initialRequestContext = getRequestContext2();
2062
2096
  const sessions = this.sessions || /* @__PURE__ */ new Map();
2063
2097
  const { requestContext } = findSessionContext2(
@@ -2105,24 +2139,25 @@ function registerResourceTemplate(resourceTemplateDefinition, callback) {
2105
2139
  `Resource template '${resourceTemplateDefinition.name}' must have either a readCallback property or a callback parameter`
2106
2140
  );
2107
2141
  }
2108
- const template = new ResourceTemplate(
2109
- resourceTemplateDefinition.resourceTemplate.uriTemplate,
2110
- {
2111
- list: void 0,
2112
- // Optional: callback to list all matching resources
2113
- complete: void 0
2114
- // Optional: callback for auto-completion
2115
- }
2116
- );
2142
+ const isFlatStructure = "uriTemplate" in resourceTemplateDefinition;
2143
+ const uriTemplate = isFlatStructure ? resourceTemplateDefinition.uriTemplate : resourceTemplateDefinition.resourceTemplate.uriTemplate;
2144
+ const mimeType = isFlatStructure ? resourceTemplateDefinition.mimeType : resourceTemplateDefinition.resourceTemplate.mimeType;
2145
+ const templateDescription = isFlatStructure ? void 0 : resourceTemplateDefinition.resourceTemplate.description;
2146
+ const template = new ResourceTemplate(uriTemplate, {
2147
+ list: void 0,
2148
+ // Optional: callback to list all matching resources
2149
+ complete: void 0
2150
+ // Optional: callback for auto-completion
2151
+ });
2117
2152
  const metadata = {};
2118
2153
  if (resourceTemplateDefinition.title) {
2119
2154
  metadata.title = resourceTemplateDefinition.title;
2120
2155
  }
2121
- if (resourceTemplateDefinition.description || resourceTemplateDefinition.resourceTemplate.description) {
2122
- metadata.description = resourceTemplateDefinition.description || resourceTemplateDefinition.resourceTemplate.description;
2156
+ if (resourceTemplateDefinition.description || templateDescription) {
2157
+ metadata.description = resourceTemplateDefinition.description || templateDescription;
2123
2158
  }
2124
- if (resourceTemplateDefinition.resourceTemplate.mimeType) {
2125
- metadata.mimeType = resourceTemplateDefinition.resourceTemplate.mimeType;
2159
+ if (mimeType) {
2160
+ metadata.mimeType = mimeType;
2126
2161
  }
2127
2162
  if (resourceTemplateDefinition.annotations) {
2128
2163
  metadata.annotations = resourceTemplateDefinition.annotations;
@@ -2132,12 +2167,9 @@ function registerResourceTemplate(resourceTemplateDefinition, callback) {
2132
2167
  template,
2133
2168
  metadata,
2134
2169
  async (uri) => {
2135
- const params = this.parseTemplateUri(
2136
- resourceTemplateDefinition.resourceTemplate.uriTemplate,
2137
- uri.toString()
2138
- );
2170
+ const params = this.parseTemplateUri(uriTemplate, uri.toString());
2139
2171
  const { getRequestContext: getRequestContext2, runWithContext: runWithContext2 } = await import("../../context-storage-NA4MHWOZ.js");
2140
- const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-BQJTPWPN.js");
2172
+ const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-OOVLOJYH.js");
2141
2173
  const initialRequestContext = getRequestContext2();
2142
2174
  const sessions = this.sessions || /* @__PURE__ */ new Map();
2143
2175
  const { requestContext } = findSessionContext2(
@@ -2150,8 +2182,12 @@ function registerResourceTemplate(resourceTemplateDefinition, callback) {
2150
2182
  const executeCallback = /* @__PURE__ */ __name(async () => {
2151
2183
  if (actualCallback.length >= 3) {
2152
2184
  return await actualCallback(uri, params, enhancedContext);
2185
+ } else if (actualCallback.length === 2) {
2186
+ return await actualCallback(uri, params);
2187
+ } else if (actualCallback.length === 1) {
2188
+ return await actualCallback(uri);
2153
2189
  }
2154
- return await actualCallback(uri, params);
2190
+ return await actualCallback();
2155
2191
  }, "executeCallback");
2156
2192
  const result = requestContext ? await runWithContext2(requestContext, executeCallback) : await executeCallback();
2157
2193
  if ("contents" in result && Array.isArray(result.contents)) {
@@ -2188,7 +2224,7 @@ function registerPrompt(promptDefinition, callback) {
2188
2224
  }
2189
2225
  const wrappedCallback = /* @__PURE__ */ __name(async (params, extra) => {
2190
2226
  const { getRequestContext: getRequestContext2, runWithContext: runWithContext2 } = await import("../../context-storage-NA4MHWOZ.js");
2191
- const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-BQJTPWPN.js");
2227
+ const { findSessionContext: findSessionContext2 } = await import("../../tool-execution-helpers-OOVLOJYH.js");
2192
2228
  const initialRequestContext = getRequestContext2();
2193
2229
  const sessions = this.sessions || /* @__PURE__ */ new Map();
2194
2230
  const { requestContext } = findSessionContext2(
@@ -2486,7 +2522,7 @@ __name(startIdleCleanup, "startIdleCleanup");
2486
2522
 
2487
2523
  // src/server/endpoints/mount-mcp.ts
2488
2524
  async function mountMcp(app, mcpServerInstance, sessions, config, isProductionMode2) {
2489
- const { FetchStreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/experimental/fetch-streamable-http/index.js");
2525
+ const { FetchStreamableHTTPServerTransport } = await import("@mcp-use/modelcontextprotocol-sdk/experimental/fetch-streamable-http/index.js");
2490
2526
  const idleTimeoutMs = config.sessionIdleTimeoutMs ?? 3e5;
2491
2527
  const transports = /* @__PURE__ */ new Map();
2492
2528
  let idleCleanupInterval;
@@ -2522,6 +2558,27 @@ async function mountMcp(app, mcpServerInstance, sessions, config, isProductionMo
2522
2558
  context: c,
2523
2559
  honoContext: c
2524
2560
  });
2561
+ server.server.oninitialized = () => {
2562
+ const clientCapabilities = server.server.getClientCapabilities();
2563
+ const clientInfo = server.server.getClientInfo?.() || {};
2564
+ const protocolVersion = server.server.getProtocolVersion?.() || "unknown";
2565
+ if (clientCapabilities && sessions.has(sid)) {
2566
+ const session = sessions.get(sid);
2567
+ session.clientCapabilities = clientCapabilities;
2568
+ console.log(
2569
+ `[MCP] Captured client capabilities for session ${sid}:`,
2570
+ Object.keys(clientCapabilities)
2571
+ );
2572
+ }
2573
+ Telemetry.getInstance().trackServerInitialize({
2574
+ protocolVersion: String(protocolVersion),
2575
+ clientInfo: clientInfo || {},
2576
+ clientCapabilities: clientCapabilities || {},
2577
+ sessionId: sid
2578
+ }).catch(
2579
+ (e) => console.debug(`Failed to track server initialize: ${e}`)
2580
+ );
2581
+ };
2525
2582
  }, "onsessioninitialized"),
2526
2583
  onsessionclosed: /* @__PURE__ */ __name((sid) => {
2527
2584
  console.log(`[MCP] Session closed: ${sid}`);
@@ -2765,12 +2822,13 @@ function createBearerAuthMiddleware(provider, baseUrl) {
2765
2822
  const result = await provider.verifyToken(token);
2766
2823
  const payload = result.payload;
2767
2824
  const user = provider.getUserInfo(payload);
2825
+ const scope = payload.scope;
2768
2826
  const authInfo = {
2769
2827
  user,
2770
2828
  payload,
2771
2829
  accessToken: token,
2772
2830
  // Extract scopes from scope claim (OAuth standard)
2773
- scopes: payload.scope ? payload.scope.split(" ") : [],
2831
+ scopes: scope ? scope.split(" ") : [],
2774
2832
  // Extract permissions (Auth0 style, or custom)
2775
2833
  permissions: payload.permissions || []
2776
2834
  };
@@ -2818,9 +2876,16 @@ async function setupOAuthForServer(app, oauthProvider, baseUrl, state) {
2818
2876
  __name(setupOAuthForServer, "setupOAuthForServer");
2819
2877
 
2820
2878
  // src/server/mcp-server.ts
2821
- var McpServer = class {
2879
+ var MCPServerClass = class {
2822
2880
  static {
2823
- __name(this, "McpServer");
2881
+ __name(this, "MCPServerClass");
2882
+ }
2883
+ /**
2884
+ * Get the mcp-use package version.
2885
+ * Works in all environments (Node.js, browser, Cloudflare Workers, Deno, etc.)
2886
+ */
2887
+ static getPackageVersion() {
2888
+ return getPackageVersion();
2824
2889
  }
2825
2890
  /**
2826
2891
  * Native MCP server instance from @modelcontextprotocol/sdk
@@ -2844,8 +2909,6 @@ var McpServer = class {
2844
2909
  buildId;
2845
2910
  sessions = /* @__PURE__ */ new Map();
2846
2911
  idleCleanupInterval;
2847
- oauthConfig;
2848
- // Store OAuth config for lazy initialization
2849
2912
  oauthSetupState = {
2850
2913
  complete: false,
2851
2914
  provider: void 0,
@@ -2854,15 +2917,21 @@ var McpServer = class {
2854
2917
  oauthProvider;
2855
2918
  oauthMiddleware;
2856
2919
  /**
2857
- * Storage for registration "recipes" that can be replayed on new server instances
2920
+ * Storage for registrations that can be replayed on new server instances
2858
2921
  * Following the official SDK pattern where each session gets its own server instance
2922
+ * @internal Exposed for telemetry purposes
2859
2923
  */
2860
- registrationRecipes = {
2924
+ registrations = {
2861
2925
  tools: /* @__PURE__ */ new Map(),
2862
2926
  prompts: /* @__PURE__ */ new Map(),
2863
2927
  resources: /* @__PURE__ */ new Map(),
2864
2928
  resourceTemplates: /* @__PURE__ */ new Map()
2865
2929
  };
2930
+ /**
2931
+ * Storage for widget definitions, used to inject metadata into tool responses
2932
+ * when using the widget() helper with returnsWidget option
2933
+ */
2934
+ widgetDefinitions = /* @__PURE__ */ new Map();
2866
2935
  /**
2867
2936
  * Resource subscription manager for tracking and notifying resource updates
2868
2937
  */
@@ -2887,7 +2956,7 @@ var McpServer = class {
2887
2956
  * access to Hono methods while preserving MCP server functionality.
2888
2957
  *
2889
2958
  * @param config - Server configuration including name, version, and description
2890
- * @returns A proxied McpServer instance that supports both MCP and Hono methods
2959
+ * @returns A proxied MCPServer instance that supports both MCP and Hono methods
2891
2960
  */
2892
2961
  constructor(config) {
2893
2962
  this.config = config;
@@ -2909,12 +2978,12 @@ var McpServer = class {
2909
2978
  }
2910
2979
  );
2911
2980
  this.app = createHonoApp(requestLogger);
2912
- this.oauthConfig = config.oauth;
2981
+ this.oauthProvider = config.oauth;
2913
2982
  this.wrapRegistrationMethods();
2914
2983
  return createHonoProxy(this, this.app);
2915
2984
  }
2916
2985
  /**
2917
- * Wrap registration methods to capture recipes following official SDK pattern.
2986
+ * Wrap registration methods to capture registrations following official SDK pattern.
2918
2987
  * Each session will get a fresh server instance with all registrations replayed.
2919
2988
  */
2920
2989
  wrapRegistrationMethods() {
@@ -2924,38 +2993,94 @@ var McpServer = class {
2924
2993
  const originalResourceTemplate = registerResourceTemplate;
2925
2994
  const self = this;
2926
2995
  this.tool = ((toolDefinition, callback) => {
2927
- const actualCallback = callback || toolDefinition.cb;
2928
- self.registrationRecipes.tools.set(toolDefinition.name, {
2929
- config: toolDefinition,
2930
- handler: actualCallback
2931
- });
2932
- return originalTool.call(self, toolDefinition, callback);
2996
+ const widgetConfig = toolDefinition.widget;
2997
+ const widgetName = widgetConfig?.name;
2998
+ if (widgetConfig && widgetName) {
2999
+ const buildIdPart = self.buildId ? `-${self.buildId}` : "";
3000
+ const outputTemplate = `ui://widget/${widgetName}${buildIdPart}.html`;
3001
+ toolDefinition._meta = {
3002
+ ...toolDefinition._meta,
3003
+ "openai/outputTemplate": outputTemplate,
3004
+ "openai/toolInvocation/invoking": widgetConfig.invoking ?? `Loading ${widgetName}...`,
3005
+ "openai/toolInvocation/invoked": widgetConfig.invoked ?? `${widgetName} ready`,
3006
+ "openai/widgetAccessible": widgetConfig.widgetAccessible ?? true,
3007
+ "openai/resultCanProduceWidget": widgetConfig.resultCanProduceWidget ?? true
3008
+ };
3009
+ }
3010
+ let actualCallback = callback || toolDefinition.cb;
3011
+ if (widgetConfig && widgetName && actualCallback) {
3012
+ const originalCallback = actualCallback;
3013
+ actualCallback = /* @__PURE__ */ __name((async (params, ctx) => {
3014
+ const result = await originalCallback(params, ctx);
3015
+ const widgetDef = self.widgetDefinitions.get(widgetName);
3016
+ if (result && typeof result === "object") {
3017
+ const randomId = Math.random().toString(36).substring(2, 15);
3018
+ const buildIdPart = self.buildId ? `-${self.buildId}` : "";
3019
+ const uniqueUri = `ui://widget/${widgetName}${buildIdPart}-${randomId}.html`;
3020
+ const responseMeta = {
3021
+ ...widgetDef || {},
3022
+ // Include mcp-use/widget and other widget metadata
3023
+ "openai/outputTemplate": uniqueUri,
3024
+ "openai/toolInvocation/invoking": widgetConfig.invoking ?? `Loading ${widgetName}...`,
3025
+ "openai/toolInvocation/invoked": widgetConfig.invoked ?? `${widgetName} ready`,
3026
+ "openai/widgetAccessible": widgetConfig.widgetAccessible ?? true,
3027
+ "openai/resultCanProduceWidget": widgetConfig.resultCanProduceWidget ?? true
3028
+ };
3029
+ result._meta = responseMeta;
3030
+ if (result.content?.[0]?.type === "text" && !result.content[0].text) {
3031
+ result.content[0].text = `Displaying ${widgetName}`;
3032
+ }
3033
+ }
3034
+ return result;
3035
+ }), "actualCallback");
3036
+ }
3037
+ if (actualCallback) {
3038
+ self.registrations.tools.set(toolDefinition.name, {
3039
+ config: toolDefinition,
3040
+ handler: actualCallback
3041
+ });
3042
+ }
3043
+ return originalTool.call(self, toolDefinition, actualCallback);
2933
3044
  });
2934
- this.prompt = function(promptDefinition, callback) {
3045
+ this.prompt = ((promptDefinition, callback) => {
2935
3046
  const actualCallback = callback || promptDefinition.cb;
2936
- self.registrationRecipes.prompts.set(promptDefinition.name, {
2937
- config: promptDefinition,
2938
- handler: actualCallback
2939
- });
2940
- return originalPrompt.call(self, promptDefinition, callback);
2941
- };
2942
- this.resource = function(resourceDefinition, callback) {
3047
+ if (actualCallback) {
3048
+ self.registrations.prompts.set(promptDefinition.name, {
3049
+ config: promptDefinition,
3050
+ handler: actualCallback
3051
+ });
3052
+ }
3053
+ return originalPrompt.call(
3054
+ self,
3055
+ promptDefinition,
3056
+ callback
3057
+ );
3058
+ });
3059
+ this.resource = ((resourceDefinition, callback) => {
2943
3060
  const actualCallback = callback || resourceDefinition.readCallback;
2944
- const resourceKey = `${resourceDefinition.name}:${resourceDefinition.uri}`;
2945
- self.registrationRecipes.resources.set(resourceKey, {
2946
- config: resourceDefinition,
2947
- handler: actualCallback
2948
- });
3061
+ if (actualCallback) {
3062
+ const resourceKey = `${resourceDefinition.name}:${resourceDefinition.uri}`;
3063
+ self.registrations.resources.set(resourceKey, {
3064
+ config: resourceDefinition,
3065
+ handler: actualCallback
3066
+ });
3067
+ }
2949
3068
  return originalResource.call(self, resourceDefinition, callback);
2950
- };
2951
- this.resourceTemplate = function(templateDefinition, callback) {
3069
+ });
3070
+ this.resourceTemplate = ((templateDefinition, callback) => {
2952
3071
  const actualCallback = callback || templateDefinition.readCallback;
2953
- self.registrationRecipes.resourceTemplates.set(templateDefinition.name, {
2954
- config: templateDefinition,
2955
- handler: actualCallback
2956
- });
2957
- return originalResourceTemplate.call(self, templateDefinition, callback);
2958
- };
3072
+ if (actualCallback) {
3073
+ self.registrations.resourceTemplates.set(templateDefinition.name, {
3074
+ config: templateDefinition,
3075
+ handler: actualCallback
3076
+ });
3077
+ }
3078
+ return originalResourceTemplate.call(
3079
+ self,
3080
+ templateDefinition,
3081
+ callback
3082
+ );
3083
+ });
2959
3084
  }
2960
3085
  /**
2961
3086
  * Create a new server instance for a session following official SDK pattern.
@@ -2973,8 +3098,8 @@ var McpServer = class {
2973
3098
  }
2974
3099
  }
2975
3100
  );
2976
- for (const [name, recipe] of this.registrationRecipes.tools) {
2977
- const { config, handler: actualCallback } = recipe;
3101
+ for (const [name, registration] of this.registrations.tools) {
3102
+ const { config, handler: actualCallback } = registration;
2978
3103
  let inputSchema;
2979
3104
  if (config.schema) {
2980
3105
  inputSchema = this.convertZodSchemaToParams(config.schema);
@@ -2993,6 +3118,15 @@ var McpServer = class {
2993
3118
  extraProgressToken,
2994
3119
  extraSendNotification
2995
3120
  );
3121
+ let sessionId;
3122
+ if (session) {
3123
+ for (const [id, s] of this.sessions.entries()) {
3124
+ if (s === session) {
3125
+ sessionId = id;
3126
+ break;
3127
+ }
3128
+ }
3129
+ }
2996
3130
  const createMessageWithLogging = /* @__PURE__ */ __name(async (params2, options) => {
2997
3131
  console.log("[createMessage] About to call server.createMessage");
2998
3132
  console.log("[createMessage] Has server:", !!newServer);
@@ -3004,11 +3138,12 @@ var McpServer = class {
3004
3138
  console.log("[createMessage] Got result successfully");
3005
3139
  return result;
3006
3140
  } catch (err) {
3141
+ const error2 = err;
3007
3142
  console.error(
3008
3143
  "[createMessage] Error:",
3009
- err.message,
3144
+ error2.message,
3010
3145
  "Code:",
3011
- err.code
3146
+ error2.code
3012
3147
  );
3013
3148
  throw err;
3014
3149
  }
@@ -3019,7 +3154,10 @@ var McpServer = class {
3019
3154
  newServer.server.elicitInput.bind(newServer.server),
3020
3155
  progressToken,
3021
3156
  sendNotification2,
3022
- session?.logLevel
3157
+ session?.logLevel,
3158
+ session?.clientCapabilities,
3159
+ sessionId,
3160
+ this.sessions
3023
3161
  );
3024
3162
  const executeCallback = /* @__PURE__ */ __name(async () => {
3025
3163
  if (actualCallback.length >= 2) {
@@ -3027,10 +3165,26 @@ var McpServer = class {
3027
3165
  }
3028
3166
  return await actualCallback(params);
3029
3167
  }, "executeCallback");
3030
- if (requestContext) {
3031
- return await runWithContext(requestContext, executeCallback);
3168
+ const startTime = Date.now();
3169
+ let success = true;
3170
+ let errorType = null;
3171
+ try {
3172
+ const result = requestContext ? await runWithContext(requestContext, executeCallback) : await executeCallback();
3173
+ return result;
3174
+ } catch (err) {
3175
+ success = false;
3176
+ errorType = err instanceof Error ? err.name : "unknown_error";
3177
+ throw err;
3178
+ } finally {
3179
+ const executionTimeMs = Date.now() - startTime;
3180
+ Telemetry.getInstance().trackServerToolCall({
3181
+ toolName: name,
3182
+ lengthInputArgument: JSON.stringify(params).length,
3183
+ success,
3184
+ errorType,
3185
+ executionTimeMs
3186
+ }).catch((e) => console.debug(`Failed to track tool call: ${e}`));
3032
3187
  }
3033
- return await executeCallback();
3034
3188
  }, "wrappedHandler");
3035
3189
  newServer.registerTool(
3036
3190
  name,
@@ -3044,8 +3198,8 @@ var McpServer = class {
3044
3198
  wrappedHandler
3045
3199
  );
3046
3200
  }
3047
- for (const [name, recipe] of this.registrationRecipes.prompts) {
3048
- const { config, handler } = recipe;
3201
+ for (const [name, registration] of this.registrations.prompts) {
3202
+ const { config, handler } = registration;
3049
3203
  let argsSchema;
3050
3204
  if (config.schema) {
3051
3205
  argsSchema = this.convertZodSchemaToParams(config.schema);
@@ -3054,13 +3208,28 @@ var McpServer = class {
3054
3208
  } else {
3055
3209
  argsSchema = void 0;
3056
3210
  }
3057
- const wrappedHandler = /* @__PURE__ */ __name(async (params) => {
3058
- const result = await handler(params);
3059
- if ("messages" in result && Array.isArray(result.messages)) {
3060
- return result;
3211
+ const wrappedHandler = /* @__PURE__ */ __name(async (params, extra) => {
3212
+ let success = true;
3213
+ let errorType = null;
3214
+ try {
3215
+ const result = await handler(params, extra);
3216
+ if ("messages" in result && Array.isArray(result.messages)) {
3217
+ return result;
3218
+ }
3219
+ const { convertToolResultToPromptResult: convertToolResultToPromptResult2 } = await import("../../conversion-OTRZZBUU.js");
3220
+ return convertToolResultToPromptResult2(result);
3221
+ } catch (err) {
3222
+ success = false;
3223
+ errorType = err instanceof Error ? err.name : "unknown_error";
3224
+ throw err;
3225
+ } finally {
3226
+ Telemetry.getInstance().trackServerPromptCall({
3227
+ name,
3228
+ description: config.description ?? null,
3229
+ success,
3230
+ errorType
3231
+ }).catch((e) => console.debug(`Failed to track prompt call: ${e}`));
3061
3232
  }
3062
- const { convertToolResultToPromptResult: convertToolResultToPromptResult2 } = await import("../../conversion-OTRZZBUU.js");
3063
- return convertToolResultToPromptResult2(result);
3064
3233
  }, "wrappedHandler");
3065
3234
  newServer.registerPrompt(
3066
3235
  name,
@@ -3072,15 +3241,42 @@ var McpServer = class {
3072
3241
  wrappedHandler
3073
3242
  );
3074
3243
  }
3075
- for (const [_key, recipe] of this.registrationRecipes.resources) {
3076
- const { config, handler } = recipe;
3077
- const wrappedHandler = /* @__PURE__ */ __name(async () => {
3078
- const result = await handler();
3079
- if ("contents" in result && Array.isArray(result.contents)) {
3080
- return result;
3244
+ for (const [_key, registration] of this.registrations.resources) {
3245
+ const { config, handler } = registration;
3246
+ const wrappedHandler = /* @__PURE__ */ __name(async (extra) => {
3247
+ let success = true;
3248
+ let errorType = null;
3249
+ let contents = [];
3250
+ try {
3251
+ const result = await handler(extra);
3252
+ if ("contents" in result && Array.isArray(result.contents)) {
3253
+ contents = result.contents;
3254
+ return result;
3255
+ }
3256
+ const { convertToolResultToResourceResult: convertToolResultToResourceResult2 } = await import("../../conversion-5MA4VY3B.js");
3257
+ const converted = convertToolResultToResourceResult2(
3258
+ config.uri,
3259
+ result
3260
+ );
3261
+ contents = converted.contents || [];
3262
+ return converted;
3263
+ } catch (err) {
3264
+ success = false;
3265
+ errorType = err instanceof Error ? err.name : "unknown_error";
3266
+ throw err;
3267
+ } finally {
3268
+ Telemetry.getInstance().trackServerResourceCall({
3269
+ name: config.name,
3270
+ description: config.description ?? null,
3271
+ contents: contents.map((c) => ({
3272
+ mime_type: c.mimeType ?? null,
3273
+ text: c.text ? `[text: ${c.text.length} chars]` : null,
3274
+ blob: c.blob ? `[blob: ${c.blob.length} bytes]` : null
3275
+ })),
3276
+ success,
3277
+ errorType
3278
+ }).catch((e) => console.debug(`Failed to track resource call: ${e}`));
3081
3279
  }
3082
- const { convertToolResultToResourceResult: convertToolResultToResourceResult2 } = await import("../../conversion-5MA4VY3B.js");
3083
- return convertToolResultToResourceResult2(config.uri, result);
3084
3280
  }, "wrappedHandler");
3085
3281
  newServer.registerResource(
3086
3282
  config.name,
@@ -3093,24 +3289,25 @@ var McpServer = class {
3093
3289
  wrappedHandler
3094
3290
  );
3095
3291
  }
3096
- for (const [_name, recipe] of this.registrationRecipes.resourceTemplates) {
3097
- const { config, handler } = recipe;
3098
- const template = new ResourceTemplate2(
3099
- config.resourceTemplate.uriTemplate,
3100
- {
3101
- list: void 0,
3102
- complete: void 0
3103
- }
3104
- );
3292
+ for (const [_name, registration] of this.registrations.resourceTemplates) {
3293
+ const { config, handler } = registration;
3294
+ const isFlatStructure = "uriTemplate" in config;
3295
+ const uriTemplate = isFlatStructure ? config.uriTemplate : config.resourceTemplate.uriTemplate;
3296
+ const mimeType = isFlatStructure ? config.mimeType : config.resourceTemplate.mimeType;
3297
+ const templateDescription = isFlatStructure ? void 0 : config.resourceTemplate.description;
3298
+ const template = new ResourceTemplate2(uriTemplate, {
3299
+ list: void 0,
3300
+ complete: void 0
3301
+ });
3105
3302
  const metadata = {};
3106
3303
  if (config.title) {
3107
3304
  metadata.title = config.title;
3108
3305
  }
3109
- if (config.description || config.resourceTemplate.description) {
3110
- metadata.description = config.description || config.resourceTemplate.description;
3306
+ if (config.description || templateDescription) {
3307
+ metadata.description = config.description || templateDescription;
3111
3308
  }
3112
- if (config.resourceTemplate.mimeType) {
3113
- metadata.mimeType = config.resourceTemplate.mimeType;
3309
+ if (mimeType) {
3310
+ metadata.mimeType = mimeType;
3114
3311
  }
3115
3312
  if (config.annotations) {
3116
3313
  metadata.annotations = config.annotations;
@@ -3119,23 +3316,49 @@ var McpServer = class {
3119
3316
  config.name,
3120
3317
  template,
3121
3318
  metadata,
3122
- async (uri) => {
3123
- const params = this.parseTemplateUri(
3124
- config.resourceTemplate.uriTemplate,
3125
- uri.toString()
3126
- );
3127
- const result = await handler(uri, params);
3128
- if ("contents" in result && Array.isArray(result.contents)) {
3129
- return result;
3319
+ async (uri, extra) => {
3320
+ let success = true;
3321
+ let errorType = null;
3322
+ let contents = [];
3323
+ try {
3324
+ const params = this.parseTemplateUri(uriTemplate, uri.toString());
3325
+ const result = await handler(uri, params, extra);
3326
+ if ("contents" in result && Array.isArray(result.contents)) {
3327
+ contents = result.contents;
3328
+ return result;
3329
+ }
3330
+ const { convertToolResultToResourceResult: convertToolResultToResourceResult2 } = await import("../../conversion-5MA4VY3B.js");
3331
+ const converted = convertToolResultToResourceResult2(
3332
+ uri.toString(),
3333
+ result
3334
+ );
3335
+ contents = converted.contents || [];
3336
+ return converted;
3337
+ } catch (err) {
3338
+ success = false;
3339
+ errorType = err instanceof Error ? err.name : "unknown_error";
3340
+ throw err;
3341
+ } finally {
3342
+ Telemetry.getInstance().trackServerResourceCall({
3343
+ name: config.name,
3344
+ description: config.description ?? null,
3345
+ contents: contents.map((c) => ({
3346
+ mimeType: c.mimeType ?? null,
3347
+ text: c.text ? `[text: ${c.text.length} chars]` : null,
3348
+ blob: c.blob ? `[blob: ${c.blob.length} bytes]` : null
3349
+ })),
3350
+ success,
3351
+ errorType
3352
+ }).catch(
3353
+ (e) => console.debug(`Failed to track resource template call: ${e}`)
3354
+ );
3130
3355
  }
3131
- const { convertToolResultToResourceResult: convertToolResultToResourceResult2 } = await import("../../conversion-5MA4VY3B.js");
3132
- return convertToolResultToResourceResult2(uri.toString(), result);
3133
3356
  }
3134
3357
  );
3135
3358
  }
3136
3359
  newServer.server.setRequestHandler(
3137
3360
  z2.object({ method: z2.literal("logging/setLevel") }).passthrough(),
3138
- async (request) => {
3361
+ (async (request, extra) => {
3139
3362
  const level = request.params?.level;
3140
3363
  if (!level) {
3141
3364
  throw new McpError(
@@ -3174,7 +3397,7 @@ var McpServer = class {
3174
3397
  "[MCP] Could not find session for logging/setLevel request"
3175
3398
  );
3176
3399
  throw new McpError(ErrorCode.InternalError, "Could not find session");
3177
- }
3400
+ })
3178
3401
  );
3179
3402
  this.subscriptionManager.registerHandlers(newServer, this.sessions);
3180
3403
  return newServer;
@@ -3190,18 +3413,18 @@ var McpServer = class {
3190
3413
  this.serverPort
3191
3414
  );
3192
3415
  }
3193
- // Tool registration helper
3194
- tool = toolRegistration;
3416
+ // Tool registration helper - type is set in wrapRegistrationMethods
3417
+ tool;
3195
3418
  // Schema conversion helpers (used by tool registration)
3196
3419
  convertZodSchemaToParams = convertZodSchemaToParams;
3197
3420
  createParamsSchema = createParamsSchema;
3198
3421
  // Template URI parsing helper (used by resource templates)
3199
3422
  parseTemplateUri = parseTemplateUri;
3200
- // Resource registration helpers
3201
- resource = registerResource;
3202
- resourceTemplate = registerResourceTemplate;
3203
- // Prompt registration helper
3204
- prompt = registerPrompt;
3423
+ // Resource registration helpers - types are set in wrapRegistrationMethods
3424
+ resource;
3425
+ resourceTemplate;
3426
+ // Prompt registration helper - type is set in wrapRegistrationMethods
3427
+ prompt;
3205
3428
  // Notification helpers
3206
3429
  getActiveSessions = getActiveSessions;
3207
3430
  sendNotification = sendNotification;
@@ -3224,7 +3447,9 @@ var McpServer = class {
3224
3447
  async notifyResourceUpdated(uri) {
3225
3448
  return this.subscriptionManager.notifyResourceUpdated(uri, this.sessions);
3226
3449
  }
3227
- uiResource = uiResourceRegistration;
3450
+ uiResource = /* @__PURE__ */ __name((definition) => {
3451
+ return uiResourceRegistration(this, definition);
3452
+ }, "uiResource");
3228
3453
  /**
3229
3454
  * Mount MCP server endpoints at /mcp and /sse
3230
3455
  *
@@ -3249,7 +3474,7 @@ var McpServer = class {
3249
3474
  const result = await mountMcp(
3250
3475
  this.app,
3251
3476
  this,
3252
- // Pass the McpServer instance so mountMcp can call getServerForSession()
3477
+ // Pass the MCPServer instance so mountMcp can call getServerForSession()
3253
3478
  this.sessions,
3254
3479
  this.config,
3255
3480
  isProductionMode()
@@ -3312,7 +3537,7 @@ var McpServer = class {
3312
3537
  this.serverHost,
3313
3538
  this.serverPort
3314
3539
  );
3315
- if (this.oauthConfig && !this.oauthSetupState.complete) {
3540
+ if (this.oauthProvider && !this.oauthSetupState.complete) {
3316
3541
  await setupOAuthForServer(
3317
3542
  this.app,
3318
3543
  this.oauthProvider,
@@ -3327,10 +3552,14 @@ var McpServer = class {
3327
3552
  await this.mountMcp();
3328
3553
  await this.mountInspector();
3329
3554
  this.logRegisteredItems();
3555
+ this._trackServerRun("http");
3330
3556
  await startServer(this.app, this.serverPort, this.serverHost, {
3331
3557
  onDenoRequest: rewriteSupabaseRequest
3332
3558
  });
3333
3559
  }
3560
+ _trackServerRun(transport) {
3561
+ Telemetry.getInstance().trackServerRunFromServer(this, transport).catch((e) => console.debug(`Failed to track server run: ${e}`));
3562
+ }
3334
3563
  /**
3335
3564
  * Get the fetch handler for the server after mounting all endpoints
3336
3565
  *
@@ -3349,7 +3578,7 @@ var McpServer = class {
3349
3578
  * @example
3350
3579
  * ```typescript
3351
3580
  * // For Supabase Edge Functions (handles path rewriting automatically)
3352
- * const server = createMCPServer('my-server');
3581
+ * const server = new MCPServer({ name: 'my-server', version: '1.0.0' });
3353
3582
  * server.tool({ ... });
3354
3583
  * const handler = await server.getHandler({ provider: 'supabase' });
3355
3584
  * Deno.serve(handler);
@@ -3358,14 +3587,14 @@ var McpServer = class {
3358
3587
  * @example
3359
3588
  * ```typescript
3360
3589
  * // For Cloudflare Workers
3361
- * const server = createMCPServer('my-server');
3590
+ * const server = new MCPServer({ name: 'my-server', version: '1.0.0' });
3362
3591
  * server.tool({ ... });
3363
3592
  * const handler = await server.getHandler();
3364
3593
  * export default { fetch: handler };
3365
3594
  * ```
3366
3595
  */
3367
3596
  async getHandler(options) {
3368
- if (this.oauthConfig && !this.oauthSetupState.complete) {
3597
+ if (this.oauthProvider && !this.oauthSetupState.complete) {
3369
3598
  await setupOAuthForServer(
3370
3599
  this.app,
3371
3600
  this.oauthProvider,
@@ -3384,6 +3613,8 @@ var McpServer = class {
3384
3613
  console.log("[MCP] Mounting inspector");
3385
3614
  await this.mountInspector();
3386
3615
  console.log("[MCP] Mounted inspector");
3616
+ const provider = options?.provider || "fetch";
3617
+ this._trackServerRun(provider);
3387
3618
  const fetchHandler = this.app.fetch.bind(this.app);
3388
3619
  if (options?.provider === "supabase") {
3389
3620
  return async (req) => {
@@ -3435,8 +3666,9 @@ var McpServer = class {
3435
3666
  }
3436
3667
  }
3437
3668
  };
3669
+ var MCPServer = MCPServerClass;
3438
3670
  function createMCPServer(name, config = {}) {
3439
- const instance = new McpServer({
3671
+ const instance = new MCPServerClass({
3440
3672
  name,
3441
3673
  version: config.version || "1.0.0",
3442
3674
  description: config.description,
@@ -3520,12 +3752,13 @@ var SupabaseOAuthProvider = class {
3520
3752
  }
3521
3753
  }
3522
3754
  getUserInfo(payload) {
3755
+ const userMetadata = payload.user_metadata;
3523
3756
  return {
3524
3757
  userId: payload.sub || payload.user_id,
3525
3758
  email: payload.email,
3526
- name: payload.user_metadata?.name || payload.user_metadata?.full_name,
3527
- username: payload.user_metadata?.username,
3528
- picture: payload.user_metadata?.avatar_url,
3759
+ name: userMetadata?.name || userMetadata?.full_name,
3760
+ username: userMetadata?.username,
3761
+ picture: userMetadata?.avatar_url,
3529
3762
  roles: payload.role ? [payload.role] : [],
3530
3763
  permissions: payload.aal ? [`aal:${payload.aal}`] : [],
3531
3764
  // Include Supabase-specific claims
@@ -3598,6 +3831,7 @@ var Auth0OAuthProvider = class {
3598
3831
  }
3599
3832
  }
3600
3833
  getUserInfo(payload) {
3834
+ const scope = payload.scope;
3601
3835
  return {
3602
3836
  userId: payload.sub,
3603
3837
  email: payload.email,
@@ -3610,7 +3844,7 @@ var Auth0OAuthProvider = class {
3610
3844
  // Auth0 can include roles (if configured)
3611
3845
  roles: payload.roles || payload["https://your-app.com/roles"] || [],
3612
3846
  // Include scope as well
3613
- scopes: payload.scope ? payload.scope.split(" ") : [],
3847
+ scopes: scope ? scope.split(" ") : [],
3614
3848
  // Additional Auth0-specific claims
3615
3849
  email_verified: payload.email_verified,
3616
3850
  updated_at: payload.updated_at
@@ -3682,8 +3916,10 @@ var KeycloakOAuthProvider = class {
3682
3916
  }
3683
3917
  }
3684
3918
  getUserInfo(payload) {
3685
- const realmRoles = payload.realm_access?.roles || [];
3686
- const clientRoles = this.config.clientId && payload.resource_access?.[this.config.clientId]?.roles || [];
3919
+ const realmAccess = payload.realm_access;
3920
+ const realmRoles = realmAccess?.roles || [];
3921
+ const resourceAccess = payload.resource_access;
3922
+ const clientRoles = this.config.clientId && (resourceAccess?.[this.config.clientId]?.roles || []) || [];
3687
3923
  const allRoles = [...realmRoles, ...clientRoles];
3688
3924
  const permissions = [];
3689
3925
  if (payload.resource_access) {
@@ -3697,6 +3933,7 @@ var KeycloakOAuthProvider = class {
3697
3933
  }
3698
3934
  );
3699
3935
  }
3936
+ const scope = payload.scope;
3700
3937
  return {
3701
3938
  userId: payload.sub,
3702
3939
  email: payload.email,
@@ -3707,7 +3944,7 @@ var KeycloakOAuthProvider = class {
3707
3944
  roles: allRoles,
3708
3945
  permissions,
3709
3946
  // Include scope as well
3710
- scopes: payload.scope ? payload.scope.split(" ") : [],
3947
+ scopes: scope ? scope.split(" ") : [],
3711
3948
  // Keycloak-specific claims
3712
3949
  email_verified: payload.email_verified,
3713
3950
  given_name: payload.given_name,
@@ -3836,7 +4073,7 @@ var CustomOAuthProvider = class {
3836
4073
  async verifyToken(token) {
3837
4074
  try {
3838
4075
  const result = await this.config.verifyToken(token);
3839
- return { payload: result };
4076
+ return result;
3840
4077
  } catch (error2) {
3841
4078
  throw new Error(`Custom OAuth verification failed: ${error2}`);
3842
4079
  }
@@ -3845,16 +4082,19 @@ var CustomOAuthProvider = class {
3845
4082
  if (this.config.getUserInfo) {
3846
4083
  return this.config.getUserInfo(payload);
3847
4084
  }
4085
+ const scope = payload.scope;
4086
+ const roles = payload.roles;
4087
+ const permissions = payload.permissions;
3848
4088
  return {
3849
4089
  userId: payload.sub || payload.user_id || payload.id,
3850
- email: payload.email,
3851
- name: payload.name,
3852
- username: payload.username || payload.preferred_username,
3853
- nickname: payload.nickname,
3854
- picture: payload.picture || payload.avatar_url,
3855
- roles: payload.roles || [],
3856
- permissions: payload.permissions || [],
3857
- scopes: payload.scope ? payload.scope.split(" ") : []
4090
+ email: payload.email ? payload.email : void 0,
4091
+ name: payload.name ? payload.name : void 0,
4092
+ username: payload.username || payload.preferred_username ? payload.username || payload.preferred_username : void 0,
4093
+ nickname: payload.nickname ? payload.nickname : void 0,
4094
+ picture: payload.picture || payload.avatar_url ? payload.picture || payload.avatar_url : void 0,
4095
+ roles: Array.isArray(roles) ? roles : [],
4096
+ permissions: Array.isArray(permissions) ? permissions : [],
4097
+ scopes: scope ? scope.split(" ") : []
3858
4098
  };
3859
4099
  }
3860
4100
  getIssuer() {
@@ -4039,6 +4279,8 @@ function requireAnyScope(needed) {
4039
4279
  }
4040
4280
  __name(requireAnyScope, "requireAnyScope");
4041
4281
  export {
4282
+ MCPServer,
4283
+ VERSION,
4042
4284
  adaptConnectMiddleware,
4043
4285
  adaptMiddleware,
4044
4286
  array,
@@ -4053,6 +4295,7 @@ export {
4053
4295
  css,
4054
4296
  error,
4055
4297
  getAuth,
4298
+ getPackageVersion,
4056
4299
  getRequestContext,
4057
4300
  hasAnyScope,
4058
4301
  hasRequestContext,