@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.
- package/LICENSE +21 -21
- package/README.md +397 -404
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/bin/mcp-ts.js +0 -0
- package/dist/bin/mcp-ts.js.map +1 -1
- package/dist/bin/mcp-ts.mjs +0 -0
- package/dist/bin/mcp-ts.mjs.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/react.d.mts +10 -28
- package/dist/client/react.d.ts +10 -28
- package/dist/client/react.js +101 -52
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +102 -53
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs.map +1 -1
- package/dist/index.js +78 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +73 -6
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.js +78 -6
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +73 -6
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs.map +1 -1
- package/package.json +185 -185
- package/src/adapters/agui-middleware.ts +382 -382
- package/src/bin/mcp-ts.ts +102 -102
- package/src/client/core/app-host.ts +417 -417
- package/src/client/core/sse-client.ts +371 -371
- package/src/client/core/types.ts +31 -31
- package/src/client/index.ts +27 -27
- package/src/client/react/index.ts +20 -16
- package/src/client/react/use-app-host.ts +74 -73
- package/src/client/react/use-mcp-apps.tsx +224 -214
- package/src/client/react/use-mcp.ts +669 -641
- package/src/client/vue/index.ts +10 -10
- package/src/client/vue/use-mcp.ts +617 -617
- package/src/index.ts +11 -11
- package/src/server/handlers/nextjs-handler.ts +204 -204
- package/src/server/handlers/sse-handler.ts +631 -631
- package/src/server/index.ts +57 -57
- package/src/server/mcp/multi-session-client.ts +228 -228
- package/src/server/mcp/oauth-client.ts +1188 -1188
- package/src/server/mcp/storage-oauth-provider.ts +272 -272
- package/src/server/storage/crypto.ts +92 -0
- package/src/server/storage/file-backend.ts +157 -157
- package/src/server/storage/index.ts +176 -176
- package/src/server/storage/memory-backend.ts +123 -123
- package/src/server/storage/redis-backend.ts +276 -276
- package/src/server/storage/redis.ts +160 -160
- package/src/server/storage/sqlite-backend.ts +182 -182
- package/src/server/storage/supabase-backend.ts +229 -228
- package/src/server/storage/types.ts +116 -116
- package/src/shared/constants.ts +29 -29
- package/src/shared/errors.ts +133 -133
- package/src/shared/event-routing.ts +28 -28
- package/src/shared/events.ts +180 -180
- package/src/shared/index.ts +75 -75
- package/src/shared/tool-utils.ts +61 -61
- package/src/shared/types.ts +282 -282
- package/src/shared/utils.ts +38 -38
- package/supabase/migrations/20260330195700_install_mcp_sessions.sql +84 -84
package/dist/client/react.mjs
CHANGED
|
@@ -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
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
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
|
|
888
|
-
|
|
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
|
-
|
|
906
|
-
|
|
907
|
-
}, [
|
|
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
|
-
|
|
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
|