@mcp-ts/sdk 2.4.5 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/dist/adapters/agui-adapter.d.mts +3 -3
  2. package/dist/adapters/agui-adapter.d.ts +3 -3
  3. package/dist/adapters/agui-adapter.js.map +1 -1
  4. package/dist/adapters/agui-adapter.mjs.map +1 -1
  5. package/dist/adapters/agui-middleware.d.mts +3 -3
  6. package/dist/adapters/agui-middleware.d.ts +3 -3
  7. package/dist/adapters/agui-middleware.js.map +1 -1
  8. package/dist/adapters/agui-middleware.mjs.map +1 -1
  9. package/dist/adapters/ai-adapter.d.mts +3 -3
  10. package/dist/adapters/ai-adapter.d.ts +3 -3
  11. package/dist/adapters/ai-adapter.js.map +1 -1
  12. package/dist/adapters/ai-adapter.mjs.map +1 -1
  13. package/dist/adapters/langchain-adapter.d.mts +3 -3
  14. package/dist/adapters/langchain-adapter.d.ts +3 -3
  15. package/dist/adapters/langchain-adapter.js +2 -2
  16. package/dist/adapters/langchain-adapter.js.map +1 -1
  17. package/dist/adapters/langchain-adapter.mjs +2 -2
  18. package/dist/adapters/langchain-adapter.mjs.map +1 -1
  19. package/dist/adapters/mastra-adapter.d.mts +2 -2
  20. package/dist/adapters/mastra-adapter.d.ts +2 -2
  21. package/dist/adapters/mastra-adapter.js +2 -2
  22. package/dist/adapters/mastra-adapter.js.map +1 -1
  23. package/dist/adapters/mastra-adapter.mjs +2 -2
  24. package/dist/adapters/mastra-adapter.mjs.map +1 -1
  25. package/dist/client/index.d.mts +2 -2
  26. package/dist/client/index.d.ts +2 -2
  27. package/dist/client/index.js +9 -0
  28. package/dist/client/index.js.map +1 -1
  29. package/dist/client/index.mjs +9 -0
  30. package/dist/client/index.mjs.map +1 -1
  31. package/dist/client/react.d.mts +15 -4
  32. package/dist/client/react.d.ts +15 -4
  33. package/dist/client/react.js +56 -37
  34. package/dist/client/react.js.map +1 -1
  35. package/dist/client/react.mjs +56 -37
  36. package/dist/client/react.mjs.map +1 -1
  37. package/dist/client/vue.d.mts +4 -4
  38. package/dist/client/vue.d.ts +4 -4
  39. package/dist/client/vue.js +9 -0
  40. package/dist/client/vue.js.map +1 -1
  41. package/dist/client/vue.mjs +9 -0
  42. package/dist/client/vue.mjs.map +1 -1
  43. package/dist/{index-CZk2gu2E.d.ts → index-BEdyuz1M.d.ts} +6 -1
  44. package/dist/{index-CkM3p0eE.d.mts → index-C99wE2Zf.d.mts} +6 -1
  45. package/dist/index.d.mts +4 -4
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.js +380 -82
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +376 -82
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/{multi-session-client-QOOPdEVp.d.ts → multi-session-client-CclWRxTD.d.mts} +14 -2
  52. package/dist/{multi-session-client-ChQrBZhF.d.mts → multi-session-client-DzvZD6Tt.d.ts} +14 -2
  53. package/dist/server/index.d.mts +18 -4
  54. package/dist/server/index.d.ts +18 -4
  55. package/dist/server/index.js +371 -82
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/index.mjs +367 -82
  58. package/dist/server/index.mjs.map +1 -1
  59. package/dist/shared/index.d.mts +4 -4
  60. package/dist/shared/index.d.ts +4 -4
  61. package/dist/shared/index.js.map +1 -1
  62. package/dist/shared/index.mjs.map +1 -1
  63. package/dist/{tool-router-CGs3IDOJ.d.mts → tool-router-C9ECn3FX.d.mts} +1 -1
  64. package/dist/{tool-router-DQ-HrD7W.d.ts → tool-router-CUSSk6lT.d.ts} +1 -1
  65. package/dist/{types-Bf-7GOLW.d.mts → types-CbFbPkfQ.d.mts} +38 -3
  66. package/dist/{types-Bf-7GOLW.d.ts → types-CbFbPkfQ.d.ts} +38 -3
  67. package/migrations/neon/20260513010000_install_mcp_sessions.sql +1 -0
  68. package/migrations/supabase/20260330195700_install_mcp_sessions.sql +1 -0
  69. package/package.json +2 -2
  70. package/src/adapters/agui-adapter.ts +6 -2
  71. package/src/adapters/ai-adapter.ts +3 -1
  72. package/src/adapters/langchain-adapter.ts +5 -3
  73. package/src/adapters/mastra-adapter.ts +5 -3
  74. package/src/client/core/sse-client.ts +21 -0
  75. package/src/client/react/oauth-popup.tsx +17 -24
  76. package/src/client/react/use-mcp.ts +69 -15
  77. package/src/server/handlers/sse-handler.ts +202 -9
  78. package/src/server/mcp/multi-session-client.ts +7 -3
  79. package/src/server/mcp/oauth-client.ts +25 -10
  80. package/src/server/mcp/tool-policy-gateway.ts +90 -0
  81. package/src/server/storage/neon-backend.ts +65 -60
  82. package/src/server/storage/session-lifecycle.ts +5 -0
  83. package/src/server/storage/supabase-backend.ts +27 -15
  84. package/src/server/storage/tool-policy.ts +89 -0
  85. package/src/server/storage/types.ts +11 -0
  86. package/src/shared/types.ts +52 -1
@@ -37,6 +37,15 @@ var SSEClient = class {
37
37
  async disconnectFromServer(sessionId) {
38
38
  return this.sendRequest("disconnect", { sessionId });
39
39
  }
40
+ async reconnectToServer(params) {
41
+ return this.sendRequest("reconnect", params);
42
+ }
43
+ async setToolPolicy(sessionId, toolPolicy) {
44
+ return this.sendRequest("setToolPolicy", { sessionId, toolPolicy });
45
+ }
46
+ async getToolPolicy(sessionId) {
47
+ return this.sendRequest("getToolPolicy", { sessionId });
48
+ }
40
49
  async listTools(sessionId) {
41
50
  return this.sendRequest("listTools", { sessionId });
42
51
  }
@@ -423,6 +432,7 @@ function useMcp(options) {
423
432
  state: getInitialConnectionState(s.status),
424
433
  createdAt: new Date(s.createdAt),
425
434
  updatedAt: new Date(s.updatedAt ?? s.createdAt),
435
+ toolPolicy: s.toolPolicy,
426
436
  tools: []
427
437
  }))
428
438
  );
@@ -468,21 +478,10 @@ function useMcp(options) {
468
478
  if (!clientRef.current) {
469
479
  throw new Error("SSE client not initialized");
470
480
  }
471
- const existing = connections.find(
472
- (c) => c.serverId === params.serverId || c.serverUrl === params.serverUrl
473
- );
474
- if (existing) {
475
- await clientRef.current.disconnectFromServer(existing.sessionId);
476
- if (isMountedRef.current) {
477
- setConnections(
478
- (prev) => prev.filter((c) => c.sessionId !== existing.sessionId)
479
- );
480
- }
481
- }
482
- const result = await clientRef.current.connectToServer(params);
481
+ const result = await clientRef.current.reconnectToServer(params);
483
482
  return result.sessionId;
484
483
  },
485
- [connections]
484
+ []
486
485
  );
487
486
  const disconnect = useCallback(async (sessionId) => {
488
487
  if (!clientRef.current) {
@@ -530,6 +529,29 @@ function useMcp(options) {
530
529
  }
531
530
  return await clientRef.current.listTools(sessionId);
532
531
  }, []);
532
+ const updateToolPolicy = useCallback(async (sessionId, toolPolicy) => {
533
+ if (!clientRef.current) {
534
+ throw new Error("SSE client not initialized");
535
+ }
536
+ const result = await clientRef.current.setToolPolicy(sessionId, toolPolicy);
537
+ if (isMountedRef.current) {
538
+ setConnections((prev) => prev.map(
539
+ (connection) => connection.sessionId === sessionId ? {
540
+ ...connection,
541
+ toolPolicy: result.toolPolicy,
542
+ tools: result.tools,
543
+ updatedAt: /* @__PURE__ */ new Date()
544
+ } : connection
545
+ ));
546
+ }
547
+ return result;
548
+ }, []);
549
+ const getToolAccess = useCallback(async (sessionId) => {
550
+ if (!clientRef.current) {
551
+ throw new Error("SSE client not initialized");
552
+ }
553
+ return await clientRef.current.getToolPolicy(sessionId);
554
+ }, []);
533
555
  const listPrompts = useCallback(async (sessionId) => {
534
556
  if (!clientRef.current) {
535
557
  throw new Error("SSE client not initialized");
@@ -598,6 +620,8 @@ function useMcp(options) {
598
620
  resumeAuth,
599
621
  callTool,
600
622
  listTools,
623
+ updateToolPolicy,
624
+ getToolAccess,
601
625
  listPrompts,
602
626
  getPrompt,
603
627
  listResources,
@@ -622,6 +646,8 @@ function useMcp(options) {
622
646
  resumeAuth,
623
647
  callTool,
624
648
  listTools,
649
+ updateToolPolicy,
650
+ getToolAccess,
625
651
  listPrompts,
626
652
  getPrompt,
627
653
  listResources,
@@ -706,7 +732,6 @@ function createOAuthPopupRedirectHandler(options = {}) {
706
732
  openCenteredPopup(url, {
707
733
  ...options,
708
734
  onBlocked: options.onBlocked ?? ((blockedUrl) => {
709
- window.alert("Popup blocked! Allow popups for this site to complete authentication.");
710
735
  window.location.href = blockedUrl;
711
736
  })
712
737
  });
@@ -727,28 +752,24 @@ function useMcpOAuthPopup(connections, finishAuth) {
727
752
  const popupWindow = event.source && "postMessage" in event.source ? event.source : null;
728
753
  const rawState = typeof event.data.state === "string" ? event.data.state : typeof event.data.sessionId === "string" ? event.data.sessionId : "";
729
754
  const targetSessionId = rawState ? parseOAuthState(rawState)?.sessionId || rawState : "";
730
- if (popupWindow && targetSessionId) {
755
+ if (targetSessionId) {
731
756
  pendingPopupsRef.current.set(targetSessionId, { popupWindow, state: rawState });
732
757
  }
733
758
  if (!targetSessionId) {
734
- if (popupWindow) {
735
- postPopupResult(popupWindow, {
736
- success: false,
737
- error: "Missing OAuth session identifier"
738
- });
739
- }
759
+ postPopupResult(popupWindow, {
760
+ success: false,
761
+ error: "Missing OAuth session identifier"
762
+ });
740
763
  return;
741
764
  }
742
765
  const targetSession = connections.find((connection) => connection.sessionId === targetSessionId);
743
766
  if (!targetSession) {
744
- if (popupWindow) {
745
- postPopupResult(popupWindow, {
746
- sessionId: targetSessionId,
747
- state: rawState,
748
- success: false,
749
- error: "OAuth session not found in the current client state"
750
- });
751
- }
767
+ postPopupResult(popupWindow, {
768
+ sessionId: targetSessionId,
769
+ state: rawState,
770
+ success: false,
771
+ error: "OAuth session not found in the current client state"
772
+ });
752
773
  return;
753
774
  }
754
775
  const codeKey = `${targetSession.sessionId}:${code}`;
@@ -761,14 +782,12 @@ function useMcpOAuthPopup(connections, finishAuth) {
761
782
  } catch (error) {
762
783
  processingCodesRef.current.delete(codeKey);
763
784
  pendingPopupsRef.current.delete(targetSession.sessionId);
764
- if (popupWindow) {
765
- postPopupResult(popupWindow, {
766
- sessionId: rawState,
767
- state: rawState,
768
- success: false,
769
- error: error instanceof Error ? error.message : "Failed to finish auth"
770
- });
771
- }
785
+ postPopupResult(popupWindow, {
786
+ sessionId: rawState,
787
+ state: rawState,
788
+ success: false,
789
+ error: error instanceof Error ? error.message : "Failed to finish auth"
790
+ });
772
791
  }
773
792
  };
774
793
  const channel = createAuthBroadcastChannel();