@mcp-ts/sdk 1.0.0

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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +297 -0
  3. package/dist/adapters/agui-adapter.d.mts +119 -0
  4. package/dist/adapters/agui-adapter.d.ts +119 -0
  5. package/dist/adapters/agui-adapter.js +109 -0
  6. package/dist/adapters/agui-adapter.js.map +1 -0
  7. package/dist/adapters/agui-adapter.mjs +107 -0
  8. package/dist/adapters/agui-adapter.mjs.map +1 -0
  9. package/dist/adapters/agui-middleware.d.mts +171 -0
  10. package/dist/adapters/agui-middleware.d.ts +171 -0
  11. package/dist/adapters/agui-middleware.js +429 -0
  12. package/dist/adapters/agui-middleware.js.map +1 -0
  13. package/dist/adapters/agui-middleware.mjs +417 -0
  14. package/dist/adapters/agui-middleware.mjs.map +1 -0
  15. package/dist/adapters/ai-adapter.d.mts +38 -0
  16. package/dist/adapters/ai-adapter.d.ts +38 -0
  17. package/dist/adapters/ai-adapter.js +82 -0
  18. package/dist/adapters/ai-adapter.js.map +1 -0
  19. package/dist/adapters/ai-adapter.mjs +80 -0
  20. package/dist/adapters/ai-adapter.mjs.map +1 -0
  21. package/dist/adapters/langchain-adapter.d.mts +46 -0
  22. package/dist/adapters/langchain-adapter.d.ts +46 -0
  23. package/dist/adapters/langchain-adapter.js +102 -0
  24. package/dist/adapters/langchain-adapter.js.map +1 -0
  25. package/dist/adapters/langchain-adapter.mjs +100 -0
  26. package/dist/adapters/langchain-adapter.mjs.map +1 -0
  27. package/dist/adapters/mastra-adapter.d.mts +49 -0
  28. package/dist/adapters/mastra-adapter.d.ts +49 -0
  29. package/dist/adapters/mastra-adapter.js +95 -0
  30. package/dist/adapters/mastra-adapter.js.map +1 -0
  31. package/dist/adapters/mastra-adapter.mjs +93 -0
  32. package/dist/adapters/mastra-adapter.mjs.map +1 -0
  33. package/dist/client/index.d.mts +119 -0
  34. package/dist/client/index.d.ts +119 -0
  35. package/dist/client/index.js +225 -0
  36. package/dist/client/index.js.map +1 -0
  37. package/dist/client/index.mjs +223 -0
  38. package/dist/client/index.mjs.map +1 -0
  39. package/dist/client/react.d.mts +151 -0
  40. package/dist/client/react.d.ts +151 -0
  41. package/dist/client/react.js +492 -0
  42. package/dist/client/react.js.map +1 -0
  43. package/dist/client/react.mjs +489 -0
  44. package/dist/client/react.mjs.map +1 -0
  45. package/dist/client/vue.d.mts +157 -0
  46. package/dist/client/vue.d.ts +157 -0
  47. package/dist/client/vue.js +474 -0
  48. package/dist/client/vue.js.map +1 -0
  49. package/dist/client/vue.mjs +471 -0
  50. package/dist/client/vue.mjs.map +1 -0
  51. package/dist/events-BP6WyRNh.d.mts +110 -0
  52. package/dist/events-BP6WyRNh.d.ts +110 -0
  53. package/dist/index.d.mts +10 -0
  54. package/dist/index.d.ts +10 -0
  55. package/dist/index.js +2784 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +2723 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/multi-session-client-BOFgPypS.d.ts +389 -0
  60. package/dist/multi-session-client-DMF3ED2O.d.mts +389 -0
  61. package/dist/server/index.d.mts +269 -0
  62. package/dist/server/index.d.ts +269 -0
  63. package/dist/server/index.js +2444 -0
  64. package/dist/server/index.js.map +1 -0
  65. package/dist/server/index.mjs +2414 -0
  66. package/dist/server/index.mjs.map +1 -0
  67. package/dist/shared/index.d.mts +24 -0
  68. package/dist/shared/index.d.ts +24 -0
  69. package/dist/shared/index.js +223 -0
  70. package/dist/shared/index.js.map +1 -0
  71. package/dist/shared/index.mjs +190 -0
  72. package/dist/shared/index.mjs.map +1 -0
  73. package/dist/types-SbDlA2VX.d.mts +153 -0
  74. package/dist/types-SbDlA2VX.d.ts +153 -0
  75. package/dist/utils-0qmYrqoa.d.mts +92 -0
  76. package/dist/utils-0qmYrqoa.d.ts +92 -0
  77. package/package.json +165 -0
  78. package/src/adapters/agui-adapter.ts +210 -0
  79. package/src/adapters/agui-middleware.ts +512 -0
  80. package/src/adapters/ai-adapter.ts +115 -0
  81. package/src/adapters/langchain-adapter.ts +127 -0
  82. package/src/adapters/mastra-adapter.ts +126 -0
  83. package/src/client/core/sse-client.ts +340 -0
  84. package/src/client/index.ts +26 -0
  85. package/src/client/react/index.ts +10 -0
  86. package/src/client/react/useMcp.ts +558 -0
  87. package/src/client/vue/index.ts +10 -0
  88. package/src/client/vue/useMcp.ts +542 -0
  89. package/src/index.ts +11 -0
  90. package/src/server/handlers/nextjs-handler.ts +216 -0
  91. package/src/server/handlers/sse-handler.ts +699 -0
  92. package/src/server/index.ts +57 -0
  93. package/src/server/mcp/multi-session-client.ts +132 -0
  94. package/src/server/mcp/oauth-client.ts +1168 -0
  95. package/src/server/mcp/storage-oauth-provider.ts +239 -0
  96. package/src/server/storage/file-backend.ts +169 -0
  97. package/src/server/storage/index.ts +115 -0
  98. package/src/server/storage/memory-backend.ts +132 -0
  99. package/src/server/storage/redis-backend.ts +210 -0
  100. package/src/server/storage/redis.ts +160 -0
  101. package/src/server/storage/types.ts +109 -0
  102. package/src/shared/constants.ts +29 -0
  103. package/src/shared/errors.ts +133 -0
  104. package/src/shared/events.ts +166 -0
  105. package/src/shared/index.ts +70 -0
  106. package/src/shared/types.ts +274 -0
  107. package/src/shared/utils.ts +16 -0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MCP Redis Server Package
3
+ * Node.js server-side exports for MCP connection management with Redis
4
+ */
5
+
6
+ /** Core MCP client and session management */
7
+ export { MCPClient } from './mcp/oauth-client.js';
8
+ export { UnauthorizedError } from '../shared/errors.js';
9
+ export { storage, type StorageBackend } from './storage/index.js';
10
+ export { StorageOAuthClientProvider } from './mcp/storage-oauth-provider.js';
11
+ export { MultiSessionClient } from './mcp/multi-session-client.js';
12
+
13
+ /** SSE handler for real-time connections */
14
+ export { createSSEHandler, SSEConnectionManager, type SSEHandlerOptions, type ClientMetadata } from './handlers/sse-handler.js';
15
+
16
+ /** Next.js App Router handler (recommended for Next.js 13+) */
17
+ export { createNextMcpHandler, type NextMcpHandlerOptions } from './handlers/nextjs-handler.js';
18
+
19
+ /** Session provider abstraction */
20
+
21
+ /** Utilities */
22
+ export { sanitizeServerLabel } from '../shared/utils';
23
+
24
+ /** Re-export shared types */
25
+ export type {
26
+ McpConnectionEvent,
27
+ McpConnectionState,
28
+ McpObservabilityEvent,
29
+ Emitter,
30
+ Disposable,
31
+ Event,
32
+ } from '../shared/events';
33
+
34
+ export type {
35
+ ToolInfo,
36
+ McpRpcRequest,
37
+ McpRpcResponse,
38
+ ConnectRequest,
39
+ ConnectResponse,
40
+ ListToolsResponse,
41
+ CallToolRequest,
42
+ CallToolResponse,
43
+ } from '../shared/types';
44
+
45
+ /** Re-export MCP SDK types for convenience */
46
+ export type {
47
+ OAuthClientMetadata,
48
+ OAuthClientInformation,
49
+ OAuthClientInformationFull,
50
+ OAuthTokens,
51
+ } from '@modelcontextprotocol/sdk/shared/auth.js';
52
+
53
+ export type {
54
+ ListToolsResult,
55
+ CallToolResult,
56
+ Tool,
57
+ } from '@modelcontextprotocol/sdk/types.js';
@@ -0,0 +1,132 @@
1
+
2
+
3
+ import { MCPClient } from './oauth-client.js';
4
+ import { storage, type SessionData } from '../storage/index.js';
5
+
6
+ /**
7
+ * Manages multiple MCP connections for a single user identity.
8
+ * Allows aggregating tools from all connected servers.
9
+ */
10
+ export interface MultiSessionOptions {
11
+ /**
12
+ * Connection timeout in milliseconds
13
+ * @default 15000
14
+ */
15
+ timeout?: number;
16
+ /**
17
+ * Maximum number of retry attempts
18
+ * @default 2
19
+ */
20
+ maxRetries?: number;
21
+ /**
22
+ * Delay between retries in milliseconds
23
+ * @default 1000
24
+ */
25
+ retryDelay?: number;
26
+ }
27
+
28
+ /**
29
+ * Manages multiple MCP connections for a single user identity.
30
+ * Allows aggregating tools from all connected servers.
31
+ */
32
+ export class MultiSessionClient {
33
+ private clients: MCPClient[] = [];
34
+ private identity: string;
35
+ private options: MultiSessionOptions;
36
+
37
+ constructor(identity: string, options: MultiSessionOptions = {}) {
38
+ this.identity = identity;
39
+ this.options = {
40
+ timeout: 15000,
41
+ maxRetries: 2,
42
+ retryDelay: 1000,
43
+ ...options
44
+ };
45
+ }
46
+
47
+ private async getActiveSessions(): Promise<SessionData[]> {
48
+ const sessions = await storage.getIdentitySessionsData(this.identity);
49
+ console.log(`[MultiSessionClient] All sessions for ${this.identity}:`,
50
+ sessions.map(s => ({ sessionId: s.sessionId, serverId: s.serverId }))
51
+ );
52
+ const valid = sessions.filter(s => s.serverId && s.serverUrl && s.callbackUrl);
53
+ console.log(`[MultiSessionClient] Filtered valid sessions:`, valid.length);
54
+ return valid;
55
+ }
56
+
57
+ private async connectInBatches(sessions: SessionData[]): Promise<void> {
58
+ const BATCH_SIZE = 5;
59
+ for (let i = 0; i < sessions.length; i += BATCH_SIZE) {
60
+ const batch = sessions.slice(i, i + BATCH_SIZE);
61
+ await Promise.all(batch.map(session => this.connectSession(session)));
62
+ }
63
+ }
64
+
65
+ private async connectSession(session: SessionData): Promise<void> {
66
+ const existingClient = this.clients.find(c => c.getSessionId() === session.sessionId);
67
+ if (existingClient?.isConnected()) {
68
+ return;
69
+ }
70
+
71
+ const maxRetries = this.options.maxRetries ?? 2;
72
+ const retryDelay = this.options.retryDelay ?? 1000;
73
+ let lastError: unknown;
74
+
75
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
76
+ try {
77
+ const client = await this.createAndConnectClient(session);
78
+ this.clients.push(client);
79
+ return;
80
+ } catch (error) {
81
+ lastError = error;
82
+ if (attempt < maxRetries) {
83
+ await new Promise(resolve => setTimeout(resolve, retryDelay));
84
+ }
85
+ }
86
+ }
87
+
88
+ console.error(`[MultiSessionClient] Failed to connect to session ${session.sessionId} after ${maxRetries + 1} attempts:`, lastError);
89
+ }
90
+
91
+ private async createAndConnectClient(session: SessionData): Promise<MCPClient> {
92
+ const client = new MCPClient({
93
+ identity: this.identity,
94
+ sessionId: session.sessionId,
95
+ serverId: session.serverId,
96
+ serverUrl: session.serverUrl,
97
+ callbackUrl: session.callbackUrl,
98
+ serverName: session.serverName,
99
+ transportType: session.transportType,
100
+ headers: session.headers,
101
+ });
102
+
103
+ const timeoutMs = this.options.timeout ?? 15000;
104
+ const timeoutPromise = new Promise<never>((_, reject) => {
105
+ setTimeout(() => reject(new Error(`Connection timed out after ${timeoutMs}ms`)), timeoutMs);
106
+ });
107
+
108
+ await Promise.race([client.connect(), timeoutPromise]);
109
+ return client;
110
+ }
111
+
112
+ async connect(): Promise<void> {
113
+ const sessions = await this.getActiveSessions();
114
+ await this.connectInBatches(sessions);
115
+ }
116
+
117
+ /**
118
+ * Returns the array of currently connected clients.
119
+ */
120
+ getClients(): MCPClient[] {
121
+ return this.clients;
122
+ }
123
+
124
+ /**
125
+ * Disconnects all clients.
126
+ */
127
+ disconnect(): void {
128
+ this.clients.forEach((client) => client.disconnect());
129
+ this.clients = [];
130
+ }
131
+ }
132
+