mcp-use 1.5.0-canary.4 → 1.5.0-canary.5

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 (45) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/{chunk-WERYJ6PF.js → chunk-2AOGMX4T.js} +1 -1
  3. package/dist/{chunk-DSBKVAWD.js → chunk-2JBWOW4S.js} +152 -0
  4. package/dist/{chunk-UT7O4SIJ.js → chunk-BWOTID2D.js} +209 -75
  5. package/dist/{chunk-GPAOZN2F.js → chunk-QRABML5H.js} +15 -3
  6. package/dist/index.cjs +395 -84
  7. package/dist/index.d.ts +4 -2
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +30 -10
  10. package/dist/src/agents/index.cjs +1 -0
  11. package/dist/src/agents/index.js +2 -2
  12. package/dist/src/browser.cjs +351 -72
  13. package/dist/src/browser.d.ts +2 -0
  14. package/dist/src/browser.d.ts.map +1 -1
  15. package/dist/src/browser.js +2 -2
  16. package/dist/src/client/browser.d.ts.map +1 -1
  17. package/dist/src/client/prompts.cjs +3 -0
  18. package/dist/src/client/prompts.js +2 -2
  19. package/dist/src/client.d.ts +8 -0
  20. package/dist/src/client.d.ts.map +1 -1
  21. package/dist/src/config.d.ts +2 -1
  22. package/dist/src/config.d.ts.map +1 -1
  23. package/dist/src/connectors/base.d.ts +79 -1
  24. package/dist/src/connectors/base.d.ts.map +1 -1
  25. package/dist/src/connectors/http.d.ts +1 -0
  26. package/dist/src/connectors/http.d.ts.map +1 -1
  27. package/dist/src/connectors/stdio.d.ts.map +1 -1
  28. package/dist/src/connectors/websocket.d.ts +6 -0
  29. package/dist/src/connectors/websocket.d.ts.map +1 -1
  30. package/dist/src/react/index.cjs +365 -73
  31. package/dist/src/react/index.js +3 -3
  32. package/dist/src/react/types.d.ts +9 -1
  33. package/dist/src/react/types.d.ts.map +1 -1
  34. package/dist/src/react/useMcp.d.ts.map +1 -1
  35. package/dist/src/server/adapters/mcp-ui-adapter.d.ts +1 -0
  36. package/dist/src/server/adapters/mcp-ui-adapter.d.ts.map +1 -1
  37. package/dist/src/server/index.cjs +432 -27
  38. package/dist/src/server/index.js +432 -27
  39. package/dist/src/server/mcp-server.d.ts +179 -2
  40. package/dist/src/server/mcp-server.d.ts.map +1 -1
  41. package/dist/src/server/types/common.d.ts +2 -0
  42. package/dist/src/server/types/common.d.ts.map +1 -1
  43. package/dist/src/session.d.ts +40 -1
  44. package/dist/src/session.d.ts.map +1 -1
  45. package/package.json +10 -4
@@ -51,7 +51,7 @@ var import_strict_url_sanitise2 = require("strict-url-sanitise");
51
51
 
52
52
  // src/connectors/http.ts
53
53
  var import_client = require("@modelcontextprotocol/sdk/client/index.js");
54
- var import_streamableHttp2 = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
54
+ var import_streamableHttp = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
55
55
 
56
56
  // src/logging.ts
57
57
  async function getNodeModules() {
@@ -487,71 +487,169 @@ var SseConnectionManager = class extends ConnectionManager {
487
487
  }
488
488
  };
489
489
 
490
- // src/task_managers/streamable_http.ts
491
- var import_streamableHttp = require("@modelcontextprotocol/sdk/client/streamableHttp.js");
492
- var StreamableHttpConnectionManager = class extends ConnectionManager {
490
+ // src/connectors/base.ts
491
+ var import_types = require("@modelcontextprotocol/sdk/types.js");
492
+ var BaseConnector = class {
493
493
  static {
494
- __name(this, "StreamableHttpConnectionManager");
494
+ __name(this, "BaseConnector");
495
495
  }
496
- url;
496
+ client = null;
497
+ connectionManager = null;
498
+ toolsCache = null;
499
+ capabilitiesCache = null;
500
+ serverInfoCache = null;
501
+ connected = false;
497
502
  opts;
498
- _transport = null;
503
+ notificationHandlers = [];
504
+ rootsCache = [];
505
+ constructor(opts = {}) {
506
+ this.opts = opts;
507
+ if (opts.roots) {
508
+ this.rootsCache = [...opts.roots];
509
+ }
510
+ }
499
511
  /**
500
- * Create a Streamable HTTP connection manager.
512
+ * Register a handler for server notifications
501
513
  *
502
- * @param url The HTTP endpoint URL.
503
- * @param opts Optional transport options (auth, headers, etc.).
514
+ * @param handler - Function to call when a notification is received
515
+ *
516
+ * @example
517
+ * ```typescript
518
+ * connector.onNotification((notification) => {
519
+ * console.log(`Received: ${notification.method}`, notification.params);
520
+ * });
521
+ * ```
504
522
  */
505
- constructor(url, opts) {
506
- super();
507
- this.url = typeof url === "string" ? new URL(url) : url;
508
- this.opts = opts;
523
+ onNotification(handler) {
524
+ this.notificationHandlers.push(handler);
525
+ if (this.client) {
526
+ this.setupNotificationHandler();
527
+ }
509
528
  }
510
529
  /**
511
- * Spawn a new `StreamableHTTPClientTransport` and return it.
512
- * The Client.connect() method will handle starting the transport.
530
+ * Internal: wire notification handlers to the SDK client
531
+ * Includes automatic handling for list_changed notifications per MCP spec
513
532
  */
514
- async establishConnection() {
515
- this._transport = new import_streamableHttp.StreamableHTTPClientTransport(this.url, this.opts);
516
- logger.debug(`${this.constructor.name} created successfully`);
517
- return this._transport;
533
+ setupNotificationHandler() {
534
+ if (!this.client) return;
535
+ this.client.fallbackNotificationHandler = async (notification) => {
536
+ switch (notification.method) {
537
+ case "notifications/tools/list_changed":
538
+ await this.refreshToolsCache();
539
+ break;
540
+ case "notifications/resources/list_changed":
541
+ await this.onResourcesListChanged();
542
+ break;
543
+ case "notifications/prompts/list_changed":
544
+ await this.onPromptsListChanged();
545
+ break;
546
+ default:
547
+ break;
548
+ }
549
+ for (const handler of this.notificationHandlers) {
550
+ try {
551
+ await handler(notification);
552
+ } catch (err) {
553
+ logger.error("Error in notification handler:", err);
554
+ }
555
+ }
556
+ };
518
557
  }
519
558
  /**
520
- * Close the underlying transport and clean up resources.
559
+ * Auto-refresh tools cache when server sends tools/list_changed notification
521
560
  */
522
- async closeConnection(_connection) {
523
- if (this._transport) {
524
- try {
525
- await this._transport.close();
526
- } catch (e) {
527
- logger.warn(`Error closing Streamable HTTP transport: ${e}`);
528
- } finally {
529
- this._transport = null;
530
- }
561
+ async refreshToolsCache() {
562
+ if (!this.client) return;
563
+ try {
564
+ logger.debug(
565
+ "[Auto] Refreshing tools cache due to list_changed notification"
566
+ );
567
+ const result = await this.client.listTools();
568
+ this.toolsCache = result.tools ?? [];
569
+ logger.debug(
570
+ `[Auto] Refreshed tools cache: ${this.toolsCache.length} tools`
571
+ );
572
+ } catch (err) {
573
+ logger.warn("[Auto] Failed to refresh tools cache:", err);
531
574
  }
532
575
  }
533
576
  /**
534
- * Get the session ID from the transport if available.
577
+ * Called when server sends resources/list_changed notification
578
+ * Resources aren't cached by default, but we log for user awareness
535
579
  */
536
- get sessionId() {
537
- return this._transport?.sessionId;
580
+ async onResourcesListChanged() {
581
+ logger.debug(
582
+ "[Auto] Resources list changed - clients should re-fetch if needed"
583
+ );
538
584
  }
539
- };
540
-
541
- // src/connectors/base.ts
542
- var BaseConnector = class {
543
- static {
544
- __name(this, "BaseConnector");
585
+ /**
586
+ * Called when server sends prompts/list_changed notification
587
+ * Prompts aren't cached by default, but we log for user awareness
588
+ */
589
+ async onPromptsListChanged() {
590
+ logger.debug(
591
+ "[Auto] Prompts list changed - clients should re-fetch if needed"
592
+ );
545
593
  }
546
- client = null;
547
- connectionManager = null;
548
- toolsCache = null;
549
- capabilitiesCache = null;
550
- serverInfoCache = null;
551
- connected = false;
552
- opts;
553
- constructor(opts = {}) {
554
- this.opts = opts;
594
+ /**
595
+ * Set roots and notify the server.
596
+ * Roots represent directories or files that the client has access to.
597
+ *
598
+ * @param roots - Array of Root objects with `uri` (must start with "file://") and optional `name`
599
+ *
600
+ * @example
601
+ * ```typescript
602
+ * await connector.setRoots([
603
+ * { uri: "file:///home/user/project", name: "My Project" },
604
+ * { uri: "file:///home/user/data" }
605
+ * ]);
606
+ * ```
607
+ */
608
+ async setRoots(roots) {
609
+ this.rootsCache = [...roots];
610
+ if (this.client) {
611
+ logger.debug(
612
+ `Sending roots/list_changed notification with ${roots.length} root(s)`
613
+ );
614
+ await this.client.sendRootsListChanged();
615
+ }
616
+ }
617
+ /**
618
+ * Get the current roots.
619
+ */
620
+ getRoots() {
621
+ return [...this.rootsCache];
622
+ }
623
+ /**
624
+ * Internal: set up roots/list request handler.
625
+ * This is called after the client connects to register the handler for server requests.
626
+ */
627
+ setupRootsHandler() {
628
+ if (!this.client) return;
629
+ this.client.setRequestHandler(
630
+ import_types.ListRootsRequestSchema,
631
+ async (_request, _extra) => {
632
+ logger.debug(
633
+ `Server requested roots list, returning ${this.rootsCache.length} root(s)`
634
+ );
635
+ return { roots: this.rootsCache };
636
+ }
637
+ );
638
+ }
639
+ /**
640
+ * Internal: set up sampling/createMessage request handler.
641
+ * This is called after the client connects to register the handler for sampling requests.
642
+ */
643
+ setupSamplingHandler() {
644
+ if (!this.client) return;
645
+ if (!this.opts.samplingCallback) return;
646
+ this.client.setRequestHandler(
647
+ import_types.CreateMessageRequestSchema,
648
+ async (request, _extra) => {
649
+ logger.debug("Server requested sampling, forwarding to callback");
650
+ return await this.opts.samplingCallback(request.params);
651
+ }
652
+ );
555
653
  }
556
654
  /** Disconnect and release resources. */
557
655
  async disconnect() {
@@ -803,6 +901,7 @@ var HttpConnector = class extends BaseConnector {
803
901
  clientInfo;
804
902
  preferSse;
805
903
  transportType = null;
904
+ streamableTransport = null;
806
905
  constructor(baseUrl, opts = {}) {
807
906
  super(opts);
808
907
  this.baseUrl = baseUrl.replace(/\/$/, "");
@@ -838,7 +937,7 @@ var HttpConnector = class extends BaseConnector {
838
937
  } catch (err) {
839
938
  let fallbackReason = "Unknown error";
840
939
  let is401Error = false;
841
- if (err instanceof import_streamableHttp2.StreamableHTTPError) {
940
+ if (err instanceof import_streamableHttp.StreamableHTTPError) {
842
941
  is401Error = err.code === 401;
843
942
  if (err.code === 400 && err.message.includes("Missing session ID")) {
844
943
  fallbackReason = "Server requires session ID (FastMCP compatibility) - using SSE transport";
@@ -894,34 +993,67 @@ var HttpConnector = class extends BaseConnector {
894
993
  }
895
994
  async connectWithStreamableHttp(baseUrl) {
896
995
  try {
897
- this.connectionManager = new StreamableHttpConnectionManager(baseUrl, {
898
- authProvider: this.opts.authProvider,
899
- // ← Pass OAuth provider to SDK
900
- requestInit: {
901
- headers: this.headers
902
- },
903
- // Pass through timeout and other options
904
- reconnectionOptions: {
905
- maxReconnectionDelay: 3e4,
906
- initialReconnectionDelay: 1e3,
907
- reconnectionDelayGrowFactor: 1.5,
908
- maxRetries: 2
996
+ const streamableTransport = new import_streamableHttp.StreamableHTTPClientTransport(
997
+ new URL(baseUrl),
998
+ {
999
+ authProvider: this.opts.authProvider,
1000
+ // ← Pass OAuth provider to SDK
1001
+ requestInit: {
1002
+ headers: this.headers
1003
+ },
1004
+ // Pass through reconnection options
1005
+ reconnectionOptions: {
1006
+ maxReconnectionDelay: 3e4,
1007
+ initialReconnectionDelay: 1e3,
1008
+ reconnectionDelayGrowFactor: 1.5,
1009
+ maxRetries: 2
1010
+ }
1011
+ // Don't pass sessionId - let the SDK generate it automatically during connect()
909
1012
  }
910
- });
911
- let transport = await this.connectionManager.start();
1013
+ );
1014
+ let transport = streamableTransport;
912
1015
  if (this.opts.wrapTransport) {
913
1016
  const serverId = this.baseUrl;
914
- transport = this.opts.wrapTransport(transport, serverId);
1017
+ transport = this.opts.wrapTransport(
1018
+ transport,
1019
+ serverId
1020
+ );
915
1021
  }
916
- this.client = new import_client.Client(this.clientInfo, this.opts.clientOptions);
1022
+ const clientOptions = {
1023
+ ...this.opts.clientOptions || {},
1024
+ capabilities: {
1025
+ ...this.opts.clientOptions?.capabilities || {},
1026
+ roots: { listChanged: true },
1027
+ // Always advertise roots capability
1028
+ // Add sampling capability if callback is provided
1029
+ ...this.opts.samplingCallback ? { sampling: {} } : {}
1030
+ }
1031
+ };
1032
+ logger.debug(
1033
+ `Creating Client with capabilities:`,
1034
+ JSON.stringify(clientOptions.capabilities, null, 2)
1035
+ );
1036
+ this.client = new import_client.Client(this.clientInfo, clientOptions);
1037
+ this.setupRootsHandler();
1038
+ logger.debug("Roots handler registered before connect");
917
1039
  try {
918
- await this.client.connect(transport);
1040
+ await this.client.connect(transport, {
1041
+ timeout: Math.min(this.timeout, 3e3)
1042
+ });
1043
+ const sessionId = streamableTransport.sessionId;
1044
+ if (sessionId) {
1045
+ logger.debug(`Session ID obtained: ${sessionId}`);
1046
+ } else {
1047
+ logger.warn(
1048
+ "Session ID not available after connect - this may cause issues with SSE stream"
1049
+ );
1050
+ }
919
1051
  } catch (connectErr) {
920
1052
  if (connectErr instanceof Error) {
921
1053
  const errMsg = connectErr.message || connectErr.toString();
922
- if (errMsg.includes("Missing session ID") || errMsg.includes("Bad Request: Missing session ID")) {
1054
+ if (errMsg.includes("Missing session ID") || errMsg.includes("Bad Request: Missing session ID") || errMsg.includes("Mcp-Session-Id header is required")) {
923
1055
  const wrappedError = new Error(
924
- `FastMCP session ID error: ${errMsg}`
1056
+ `Session ID error: ${errMsg}. The SDK should automatically extract session ID from initialize response.`
925
1057
  );
926
1058
  wrappedError.cause = connectErr;
927
1059
  throw wrappedError;
@@ -929,8 +1061,24 @@ var HttpConnector = class extends BaseConnector {
929
1061
  }
930
1062
  throw connectErr;
931
1063
  }
1064
+ this.streamableTransport = streamableTransport;
1065
+ this.connectionManager = {
1066
+ stop: /* @__PURE__ */ __name(async () => {
1067
+ if (this.streamableTransport) {
1068
+ try {
1069
+ await this.streamableTransport.close();
1070
+ } catch (e) {
1071
+ logger.warn(`Error closing Streamable HTTP transport: ${e}`);
1072
+ } finally {
1073
+ this.streamableTransport = null;
1074
+ }
1075
+ }
1076
+ }, "stop")
1077
+ };
932
1078
  this.connected = true;
933
1079
  this.transportType = "streamable-http";
1080
+ this.setupNotificationHandler();
1081
+ this.setupSamplingHandler();
934
1082
  logger.debug(
935
1083
  `Successfully connected to MCP implementation via streamable HTTP: ${baseUrl}`
936
1084
  );
@@ -951,10 +1099,28 @@ var HttpConnector = class extends BaseConnector {
951
1099
  const serverId = this.baseUrl;
952
1100
  transport = this.opts.wrapTransport(transport, serverId);
953
1101
  }
954
- this.client = new import_client.Client(this.clientInfo, this.opts.clientOptions);
1102
+ const clientOptions = {
1103
+ ...this.opts.clientOptions || {},
1104
+ capabilities: {
1105
+ ...this.opts.clientOptions?.capabilities || {},
1106
+ roots: { listChanged: true },
1107
+ // Always advertise roots capability
1108
+ // Add sampling capability if callback is provided
1109
+ ...this.opts.samplingCallback ? { sampling: {} } : {}
1110
+ }
1111
+ };
1112
+ logger.debug(
1113
+ `Creating Client with capabilities (SSE):`,
1114
+ JSON.stringify(clientOptions.capabilities, null, 2)
1115
+ );
1116
+ this.client = new import_client.Client(this.clientInfo, clientOptions);
1117
+ this.setupRootsHandler();
1118
+ logger.debug("Roots handler registered before connect (SSE)");
955
1119
  await this.client.connect(transport);
956
1120
  this.connected = true;
957
1121
  this.transportType = "sse";
1122
+ this.setupNotificationHandler();
1123
+ this.setupSamplingHandler();
958
1124
  logger.debug(
959
1125
  `Successfully connected to MCP implementation via HTTP/SSE: ${baseUrl}`
960
1126
  );
@@ -1128,6 +1294,9 @@ var WebSocketConnector = class extends BaseConnector {
1128
1294
  this.pending.delete(id);
1129
1295
  if ("result" in data) resolve(data.result);
1130
1296
  else if ("error" in data) reject(data.error);
1297
+ } else if (data.method && !data.id) {
1298
+ logger.debug("Received notification", data.method, data.params);
1299
+ this.handleNotification(data);
1131
1300
  } else {
1132
1301
  logger.debug("Received unsolicited message", data);
1133
1302
  }
@@ -1158,6 +1327,49 @@ var WebSocketConnector = class extends BaseConnector {
1158
1327
  for (const { reject } of this.pending.values()) reject(err);
1159
1328
  this.pending.clear();
1160
1329
  }
1330
+ async handleNotification(data) {
1331
+ switch (data.method) {
1332
+ case "notifications/tools/list_changed":
1333
+ await this.refreshToolsCache();
1334
+ break;
1335
+ case "notifications/resources/list_changed":
1336
+ await this.onResourcesListChanged();
1337
+ break;
1338
+ case "notifications/prompts/list_changed":
1339
+ await this.onPromptsListChanged();
1340
+ break;
1341
+ default:
1342
+ break;
1343
+ }
1344
+ for (const handler of this.notificationHandlers) {
1345
+ try {
1346
+ await handler({
1347
+ method: data.method,
1348
+ params: data.params
1349
+ });
1350
+ } catch (err) {
1351
+ logger.error("Error in notification handler:", err);
1352
+ }
1353
+ }
1354
+ }
1355
+ /**
1356
+ * Auto-refresh tools cache when server sends tools/list_changed notification
1357
+ * Override to use WebSocket-specific listTools method
1358
+ */
1359
+ async refreshToolsCache() {
1360
+ try {
1361
+ logger.debug(
1362
+ "[Auto] Refreshing tools cache due to list_changed notification"
1363
+ );
1364
+ const tools = await this.listTools();
1365
+ this.toolsCache = tools.map((t) => t);
1366
+ logger.debug(
1367
+ `[Auto] Refreshed tools cache: ${this.toolsCache.length} tools`
1368
+ );
1369
+ } catch (err) {
1370
+ logger.warn("[Auto] Failed to refresh tools cache:", err);
1371
+ }
1372
+ }
1161
1373
  async initialize() {
1162
1374
  logger.debug("Initializing MCP session over WebSocket");
1163
1375
  const result = await this.sendRequest("initialize");
@@ -1234,6 +1446,51 @@ var MCPSession = class {
1234
1446
  get isConnected() {
1235
1447
  return this.connector && this.connector.isClientConnected;
1236
1448
  }
1449
+ /**
1450
+ * Register an event handler for session events
1451
+ *
1452
+ * @param event - The event type to listen for
1453
+ * @param handler - The handler function to call when the event occurs
1454
+ *
1455
+ * @example
1456
+ * ```typescript
1457
+ * session.on("notification", async (notification) => {
1458
+ * console.log(`Received: ${notification.method}`, notification.params);
1459
+ *
1460
+ * if (notification.method === "notifications/tools/list_changed") {
1461
+ * // Refresh tools list
1462
+ * }
1463
+ * });
1464
+ * ```
1465
+ */
1466
+ on(event, handler) {
1467
+ if (event === "notification") {
1468
+ this.connector.onNotification(handler);
1469
+ }
1470
+ }
1471
+ /**
1472
+ * Set roots and notify the server.
1473
+ * Roots represent directories or files that the client has access to.
1474
+ *
1475
+ * @param roots - Array of Root objects with `uri` (must start with "file://") and optional `name`
1476
+ *
1477
+ * @example
1478
+ * ```typescript
1479
+ * await session.setRoots([
1480
+ * { uri: "file:///home/user/project", name: "My Project" },
1481
+ * { uri: "file:///home/user/data" }
1482
+ * ]);
1483
+ * ```
1484
+ */
1485
+ async setRoots(roots) {
1486
+ return this.connector.setRoots(roots);
1487
+ }
1488
+ /**
1489
+ * Get the current roots.
1490
+ */
1491
+ getRoots() {
1492
+ return this.connector.getRoots();
1493
+ }
1237
1494
  };
1238
1495
 
1239
1496
  // src/client/base.ts
@@ -1369,7 +1626,16 @@ var BrowserMCPClient = class _BrowserMCPClient extends BaseMCPClient {
1369
1626
  * Supports HTTP and WebSocket connectors only
1370
1627
  */
1371
1628
  createConnectorFromConfig(serverConfig) {
1372
- const { url, transport, headers, authToken, authProvider, wrapTransport } = serverConfig;
1629
+ const {
1630
+ url,
1631
+ transport,
1632
+ headers,
1633
+ authToken,
1634
+ authProvider,
1635
+ wrapTransport,
1636
+ clientOptions,
1637
+ samplingCallback
1638
+ } = serverConfig;
1373
1639
  if (!url) {
1374
1640
  throw new Error("Server URL is required");
1375
1641
  }
@@ -1378,9 +1644,23 @@ var BrowserMCPClient = class _BrowserMCPClient extends BaseMCPClient {
1378
1644
  authToken,
1379
1645
  authProvider,
1380
1646
  // ← Pass OAuth provider to connector
1381
- wrapTransport
1647
+ wrapTransport,
1382
1648
  // ← Pass transport wrapper if provided
1649
+ clientOptions,
1650
+ // ← Pass client options (capabilities, etc.) to connector
1651
+ samplingCallback
1652
+ // ← Pass sampling callback to connector
1383
1653
  };
1654
+ if (clientOptions) {
1655
+ console.log(
1656
+ "[BrowserMCPClient] Passing clientOptions to connector:",
1657
+ JSON.stringify(clientOptions, null, 2)
1658
+ );
1659
+ } else {
1660
+ console.warn(
1661
+ "[BrowserMCPClient] No clientOptions provided to connector!"
1662
+ );
1663
+ }
1384
1664
  if (transport === "websocket" || url.startsWith("ws://") || url.startsWith("wss://")) {
1385
1665
  return new WebSocketConnector(url, connectorOptions);
1386
1666
  } else if (transport === "http" || url.startsWith("http://") || url.startsWith("https://")) {
@@ -1640,7 +1920,9 @@ function useMcp(options) {
1640
1920
  // 30 seconds default for connection timeout
1641
1921
  sseReadTimeout = 3e5,
1642
1922
  // 5 minutes default for SSE read timeout
1643
- wrapTransport
1923
+ wrapTransport,
1924
+ onNotification,
1925
+ samplingCallback
1644
1926
  } = options;
1645
1927
  const [state, setState] = (0, import_react.useState)("discovering");
1646
1928
  const [tools, setTools] = (0, import_react.useState)([]);
@@ -1793,6 +2075,10 @@ function useMcp(options) {
1793
2075
  ...serverConfig,
1794
2076
  authProvider: authProviderRef.current,
1795
2077
  // ← SDK handles OAuth automatically!
2078
+ clientOptions: clientConfig,
2079
+ // ← Pass client config to connector
2080
+ samplingCallback,
2081
+ // ← Pass sampling callback to connector
1796
2082
  wrapTransport: wrapTransport ? (transport) => {
1797
2083
  console.log(
1798
2084
  "[useMcp] Applying transport wrapper for server:",
@@ -1803,7 +2089,13 @@ function useMcp(options) {
1803
2089
  return wrapTransport(transport, url);
1804
2090
  } : void 0
1805
2091
  });
1806
- const session = await clientRef.current.createSession(serverName);
2092
+ const session = await clientRef.current.createSession(
2093
+ serverName,
2094
+ false
2095
+ );
2096
+ if (onNotification) {
2097
+ session.on("notification", onNotification);
2098
+ }
1807
2099
  await session.initialize();
1808
2100
  addLog("info", "\u2705 Successfully connected to MCP server");
1809
2101
  addLog("info", "Server info:", session.connector.serverInfo);
@@ -9,11 +9,11 @@ import {
9
9
  useWidgetProps,
10
10
  useWidgetState,
11
11
  useWidgetTheme
12
- } from "../../chunk-GPAOZN2F.js";
12
+ } from "../../chunk-QRABML5H.js";
13
13
  import {
14
14
  onMcpAuthorization
15
- } from "../../chunk-UT7O4SIJ.js";
16
- import "../../chunk-DSBKVAWD.js";
15
+ } from "../../chunk-BWOTID2D.js";
16
+ import "../../chunk-2JBWOW4S.js";
17
17
  import "../../chunk-34R6SIER.js";
18
18
  import "../../chunk-3GQAWCBQ.js";
19
19
  export {
@@ -1,4 +1,4 @@
1
- import type { Prompt, Resource, ResourceTemplate, Tool } from "@modelcontextprotocol/sdk/types.js";
1
+ import type { CreateMessageRequest, CreateMessageResult, Notification, Prompt, Resource, ResourceTemplate, Tool } from "@modelcontextprotocol/sdk/types.js";
2
2
  import type { BrowserMCPClient } from "../client/browser.js";
3
3
  export type UseMcpOptions = {
4
4
  /** The /sse URL of your remote MCP server */
@@ -44,6 +44,14 @@ export type UseMcpOptions = {
44
44
  sseReadTimeout?: number;
45
45
  /** Optional callback to wrap the transport before passing it to the Client. Useful for logging, monitoring, or other transport-level interceptors. */
46
46
  wrapTransport?: (transport: any, serverId: string) => any;
47
+ /** Callback function that is invoked when a notification is received from the MCP server */
48
+ onNotification?: (notification: Notification) => void;
49
+ /**
50
+ * Optional callback function to handle sampling requests from servers.
51
+ * When provided, the client will declare sampling capability and handle
52
+ * `sampling/createMessage` requests by calling this callback.
53
+ */
54
+ samplingCallback?: (params: CreateMessageRequest["params"]) => Promise<CreateMessageResult>;
47
55
  };
48
56
  export type UseMcpResult = {
49
57
  /** List of tools available from the connected MCP server */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/react/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMcp.d.ts","sourceRoot":"","sources":["../../../src/react/useMcp.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA41B3D"}
1
+ {"version":3,"file":"useMcp.d.ts","sourceRoot":"","sources":["../../../src/react/useMcp.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA22B3D"}
@@ -16,6 +16,7 @@ import type { UIResourceContent, UIResourceDefinition, UIEncoding, AppsSdkMetada
16
16
  export interface UrlConfig {
17
17
  baseUrl: string;
18
18
  port: number | string;
19
+ buildId?: string;
19
20
  }
20
21
  /**
21
22
  * Build the full URL for a widget including query parameters
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-ui-adapter.d.ts","sourceRoot":"","sources":["../../../../src/server/adapters/mcp-ui-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACtC,MAAM,EAAE,SAAS,GAChB,MAAM,CAYR;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,OAAO,GAAG,eAAyB,EAC9C,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAkBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,MAAM,EAAE,SAAS,GAChB,iBAAiB,CAwDnB"}
1
+ {"version":3,"file":"mcp-ui-adapter.d.ts","sourceRoot":"","sources":["../../../../src/server/adapters/mcp-ui-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,UAAU,EACV,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACtC,MAAM,EAAE,SAAS,GAChB,MAAM,CAYR;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,OAAO,GAAG,eAAyB,EAC9C,QAAQ,GAAE,UAAmB,EAC7B,QAAQ,CAAC,EAAE,cAAc,EACzB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAQnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,eAAe,GACzB,iBAAiB,CAkBnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,oBAAoB,EAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,MAAM,EAAE,SAAS,GAChB,iBAAiB,CAyDnB"}