@mcp-ts/sdk 1.3.7 → 1.3.10

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 (66) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +397 -404
  3. package/dist/adapters/agui-middleware.js.map +1 -1
  4. package/dist/adapters/agui-middleware.mjs.map +1 -1
  5. package/dist/bin/mcp-ts.js +0 -0
  6. package/dist/bin/mcp-ts.js.map +1 -1
  7. package/dist/bin/mcp-ts.mjs +0 -0
  8. package/dist/bin/mcp-ts.mjs.map +1 -1
  9. package/dist/client/index.js.map +1 -1
  10. package/dist/client/index.mjs.map +1 -1
  11. package/dist/client/react.d.mts +10 -28
  12. package/dist/client/react.d.ts +10 -28
  13. package/dist/client/react.js +101 -52
  14. package/dist/client/react.js.map +1 -1
  15. package/dist/client/react.mjs +102 -53
  16. package/dist/client/react.mjs.map +1 -1
  17. package/dist/client/vue.js.map +1 -1
  18. package/dist/client/vue.mjs.map +1 -1
  19. package/dist/index.js +78 -6
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +73 -6
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/server/index.js +78 -6
  24. package/dist/server/index.js.map +1 -1
  25. package/dist/server/index.mjs +73 -6
  26. package/dist/server/index.mjs.map +1 -1
  27. package/dist/shared/index.js.map +1 -1
  28. package/dist/shared/index.mjs.map +1 -1
  29. package/package.json +185 -185
  30. package/src/adapters/agui-middleware.ts +382 -382
  31. package/src/bin/mcp-ts.ts +102 -102
  32. package/src/client/core/app-host.ts +417 -417
  33. package/src/client/core/sse-client.ts +371 -371
  34. package/src/client/core/types.ts +31 -31
  35. package/src/client/index.ts +27 -27
  36. package/src/client/react/index.ts +20 -16
  37. package/src/client/react/use-app-host.ts +74 -73
  38. package/src/client/react/use-mcp-apps.tsx +224 -214
  39. package/src/client/react/use-mcp.ts +669 -641
  40. package/src/client/vue/index.ts +10 -10
  41. package/src/client/vue/use-mcp.ts +617 -617
  42. package/src/index.ts +11 -11
  43. package/src/server/handlers/nextjs-handler.ts +204 -204
  44. package/src/server/handlers/sse-handler.ts +631 -631
  45. package/src/server/index.ts +57 -57
  46. package/src/server/mcp/multi-session-client.ts +228 -228
  47. package/src/server/mcp/oauth-client.ts +1188 -1188
  48. package/src/server/mcp/storage-oauth-provider.ts +272 -272
  49. package/src/server/storage/crypto.ts +92 -0
  50. package/src/server/storage/file-backend.ts +157 -157
  51. package/src/server/storage/index.ts +176 -176
  52. package/src/server/storage/memory-backend.ts +123 -123
  53. package/src/server/storage/redis-backend.ts +276 -276
  54. package/src/server/storage/redis.ts +160 -160
  55. package/src/server/storage/sqlite-backend.ts +182 -182
  56. package/src/server/storage/supabase-backend.ts +229 -228
  57. package/src/server/storage/types.ts +116 -116
  58. package/src/shared/constants.ts +29 -29
  59. package/src/shared/errors.ts +133 -133
  60. package/src/shared/event-routing.ts +28 -28
  61. package/src/shared/events.ts +180 -180
  62. package/src/shared/index.ts +75 -75
  63. package/src/shared/tool-utils.ts +61 -61
  64. package/src/shared/types.ts +282 -282
  65. package/src/shared/utils.ts +38 -38
  66. package/supabase/migrations/20260330195700_install_mcp_sessions.sql +84 -84
@@ -1,4 +1,4 @@
1
- import { memo, useRef, useState, useEffect, useCallback } from 'react';
1
+ import { memo, useRef, useState, useEffect, useCallback, useMemo } from 'react';
2
2
  import { nanoid } from 'nanoid';
3
3
  import { AppBridge, PostMessageTransport } from '@modelcontextprotocol/ext-apps/app-bridge';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -275,6 +275,7 @@ function useMcp(options) {
275
275
  "disconnected"
276
276
  );
277
277
  const [isInitializing, setIsInitializing] = useState(false);
278
+ const [sseClient, setSseClient] = useState(null);
278
279
  useEffect(() => {
279
280
  isMountedRef.current = true;
280
281
  const clientOptions = {
@@ -297,6 +298,7 @@ function useMcp(options) {
297
298
  };
298
299
  const client = new SSEClient(clientOptions);
299
300
  clientRef.current = client;
301
+ setSseClient(client);
300
302
  if (autoConnect) {
301
303
  client.connect();
302
304
  if (autoInitialize) {
@@ -530,29 +532,54 @@ function useMcp(options) {
530
532
  },
531
533
  [getConnection]
532
534
  );
533
- return {
534
- connections,
535
- status,
536
- isInitializing,
537
- connect,
538
- disconnect,
539
- getConnection,
540
- getConnectionByServerId,
541
- isServerConnected,
542
- getTools,
543
- refresh,
544
- connectSSE,
545
- disconnectSSE,
546
- finishAuth,
547
- resumeAuth,
548
- callTool,
549
- listTools,
550
- listPrompts,
551
- getPrompt,
552
- listResources,
553
- readResource,
554
- sseClient: clientRef.current
555
- };
535
+ return useMemo(
536
+ () => ({
537
+ connections,
538
+ status,
539
+ isInitializing,
540
+ connect,
541
+ disconnect,
542
+ getConnection,
543
+ getConnectionByServerId,
544
+ isServerConnected,
545
+ getTools,
546
+ refresh,
547
+ connectSSE,
548
+ disconnectSSE,
549
+ finishAuth,
550
+ resumeAuth,
551
+ callTool,
552
+ listTools,
553
+ listPrompts,
554
+ getPrompt,
555
+ listResources,
556
+ readResource,
557
+ sseClient
558
+ }),
559
+ [
560
+ connections,
561
+ status,
562
+ isInitializing,
563
+ connect,
564
+ disconnect,
565
+ getConnection,
566
+ getConnectionByServerId,
567
+ isServerConnected,
568
+ getTools,
569
+ refresh,
570
+ connectSSE,
571
+ disconnectSSE,
572
+ finishAuth,
573
+ resumeAuth,
574
+ callTool,
575
+ listTools,
576
+ listPrompts,
577
+ getPrompt,
578
+ listResources,
579
+ readResource,
580
+ sseClient
581
+ ]
582
+ );
556
583
  }
557
584
  var HOST_INFO = { name: "mcp-ts-host", version: "1.0.0" };
558
585
  var SANDBOX_PERMISSIONS = [
@@ -884,14 +911,19 @@ function useAppHost(client, iframeRef, options) {
884
911
  }, [client, iframeRef]);
885
912
  return { host, error };
886
913
  }
887
- var McpAppRenderer = memo(function McpAppRenderer2({
888
- metadata,
914
+ var McpAppView = memo(function McpAppView2({
915
+ clientRef,
916
+ name,
889
917
  input,
890
918
  result,
891
919
  status,
892
- sseClient,
893
920
  className
894
921
  }) {
922
+ const mcpClient = clientRef.current;
923
+ const metadata = getMcpAppMetadata(mcpClient, name);
924
+ const sseClient = mcpClient?.sseClient ?? null;
925
+ const resourceUri = metadata?.resourceUri;
926
+ const appSessionId = metadata?.sessionId;
895
927
  const iframeRef = useRef(null);
896
928
  const { host, error: hostError } = useAppHost(sseClient, iframeRef);
897
929
  const [isLaunched, setIsLaunched] = useState(false);
@@ -902,19 +934,23 @@ var McpAppRenderer = memo(function McpAppRenderer2({
902
934
  const lastResultRef = useRef(result);
903
935
  const lastStatusRef = useRef(status);
904
936
  useEffect(() => {
905
- if (!host || !metadata.resourceUri || !metadata.sessionId) return;
906
- host.launch(metadata.resourceUri, metadata.sessionId).then(() => setIsLaunched(true)).catch((err) => setError(err instanceof Error ? err : new Error(String(err))));
907
- }, [host, metadata.resourceUri, metadata.sessionId]);
937
+ setIsLaunched(false);
938
+ setError(null);
939
+ }, [resourceUri, appSessionId]);
940
+ useEffect(() => {
941
+ if (!host || !resourceUri || !appSessionId) return;
942
+ host.launch(resourceUri, appSessionId).then(() => setIsLaunched(true)).catch((err) => setError(err instanceof Error ? err : new Error(String(err))));
943
+ }, [host, resourceUri, appSessionId]);
908
944
  useEffect(() => {
909
- if (!host || !isLaunched || !input) return;
945
+ if (!host || !isLaunched || !resourceUri || !appSessionId || !input) return;
910
946
  if (!sentInputRef.current || JSON.stringify(input) !== JSON.stringify(lastInputRef.current)) {
911
947
  sentInputRef.current = true;
912
948
  lastInputRef.current = input;
913
949
  host.sendToolInput(input);
914
950
  }
915
- }, [host, isLaunched, input]);
951
+ }, [host, isLaunched, input, resourceUri, appSessionId, name]);
916
952
  useEffect(() => {
917
- if (!host || !isLaunched || result === void 0) return;
953
+ if (!host || !isLaunched || !resourceUri || !appSessionId || result === void 0) return;
918
954
  if (status !== "complete") return;
919
955
  if (!sentResultRef.current || JSON.stringify(result) !== JSON.stringify(lastResultRef.current)) {
920
956
  sentResultRef.current = true;
@@ -922,7 +958,7 @@ var McpAppRenderer = memo(function McpAppRenderer2({
922
958
  const formattedResult = typeof result === "string" ? { content: [{ type: "text", text: result }] } : result;
923
959
  host.sendToolResult(formattedResult);
924
960
  }
925
- }, [host, isLaunched, result, status]);
961
+ }, [host, isLaunched, result, status, resourceUri, appSessionId, name]);
926
962
  useEffect(() => {
927
963
  if (status === "executing" && lastStatusRef.current !== "executing") {
928
964
  sentInputRef.current = false;
@@ -930,6 +966,9 @@ var McpAppRenderer = memo(function McpAppRenderer2({
930
966
  }
931
967
  lastStatusRef.current = status;
932
968
  }, [status]);
969
+ if (!metadata || !sseClient) {
970
+ return null;
971
+ }
933
972
  const displayError = error || hostError;
934
973
  if (displayError) {
935
974
  return /* @__PURE__ */ jsxs("div", { className: `p-4 bg-red-900/20 border border-red-700 rounded text-red-200 ${className || ""}`, children: [
@@ -952,33 +991,43 @@ var McpAppRenderer = memo(function McpAppRenderer2({
952
991
  ] });
953
992
  });
954
993
  function useMcpApps(mcpClient) {
994
+ const clientRef = useRef(mcpClient);
995
+ clientRef.current = mcpClient;
955
996
  const getAppMetadata = useCallback(
956
- (toolName) => {
957
- if (!mcpClient) return void 0;
958
- const extractedName = extractToolName(toolName);
959
- for (const conn of mcpClient.connections) {
960
- for (const tool of conn.tools) {
961
- const candidateName = extractToolName(tool.name);
962
- const resourceUri = tool.mcpApp?.resourceUri ?? tool._meta?.ui?.resourceUri ?? tool._meta?.["ui/resourceUri"];
963
- if (resourceUri && candidateName === extractedName) {
964
- return {
965
- toolName: candidateName,
966
- resourceUri,
967
- sessionId: conn.sessionId
968
- };
969
- }
970
- }
971
- }
972
- return void 0;
973
- },
974
- [mcpClient]
997
+ (toolName) => getMcpAppMetadata(clientRef.current, toolName),
998
+ []
975
999
  );
1000
+ const McpAppRenderer = useMemo(() => {
1001
+ const Renderer = memo(function McpAppRenderer2(props) {
1002
+ return /* @__PURE__ */ jsx(McpAppView, { clientRef, ...props });
1003
+ });
1004
+ Renderer.displayName = "McpAppRenderer";
1005
+ return Renderer;
1006
+ }, []);
976
1007
  return { getAppMetadata, McpAppRenderer };
977
1008
  }
978
1009
  function extractToolName(fullName) {
979
1010
  const match = fullName.match(/(?:tool_[^_]+_)?(.+)$/);
980
1011
  return match?.[1] || fullName;
981
1012
  }
1013
+ function getMcpAppMetadata(mcpClient, toolName) {
1014
+ if (!mcpClient) return void 0;
1015
+ const extractedName = extractToolName(toolName);
1016
+ for (const conn of mcpClient.connections) {
1017
+ for (const tool of conn.tools) {
1018
+ const candidateName = extractToolName(tool.name);
1019
+ const resourceUri = tool.mcpApp?.resourceUri ?? tool._meta?.ui?.resourceUri ?? tool._meta?.["ui/resourceUri"];
1020
+ if (resourceUri && candidateName === extractedName) {
1021
+ return {
1022
+ toolName: candidateName,
1023
+ resourceUri,
1024
+ sessionId: conn.sessionId
1025
+ };
1026
+ }
1027
+ }
1028
+ }
1029
+ return void 0;
1030
+ }
982
1031
 
983
1032
  export { AppHost, SSEClient, useAppHost, useMcp, useMcpApps };
984
1033
  //# sourceMappingURL=react.mjs.map