@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,166 @@
1
+ /**
2
+ * Simple event emitter pattern for MCP connection events
3
+ * Inspired by Cloudflare's agents pattern but adapted for serverless
4
+ */
5
+
6
+ export type Disposable = {
7
+ dispose(): void;
8
+ };
9
+
10
+ export type Event<T> = (listener: (event: T) => void) => Disposable;
11
+
12
+ /**
13
+ * Event emitter class for type-safe event handling
14
+ * Similar to Cloudflare's Emitter but simplified for our use case
15
+ */
16
+ export class Emitter<T> {
17
+ private listeners: Set<(event: T) => void> = new Set();
18
+
19
+ /**
20
+ * Subscribe to events
21
+ * @param listener - Callback function to handle events
22
+ * @returns Disposable to unsubscribe
23
+ */
24
+ get event(): Event<T> {
25
+ return (listener: (event: T) => void) => {
26
+ this.listeners.add(listener);
27
+ return {
28
+ dispose: () => {
29
+ this.listeners.delete(listener);
30
+ },
31
+ };
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Fire an event to all listeners
37
+ * @param event - Event data to emit
38
+ */
39
+ fire(event: T): void {
40
+ for (const listener of this.listeners) {
41
+ try {
42
+ listener(event);
43
+ } catch (error) {
44
+ console.error('[Emitter] Error in event listener:', error);
45
+ }
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Clear all listeners
51
+ */
52
+ dispose(): void {
53
+ this.listeners.clear();
54
+ }
55
+
56
+ /**
57
+ * Get number of active listeners
58
+ */
59
+ get listenerCount(): number {
60
+ return this.listeners.size;
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Connection state types matching your existing ConnectionStatus
66
+ * Extended with more granular states for better observability
67
+ */
68
+ export type McpConnectionState =
69
+ | 'DISCONNECTED' // Not connected
70
+ | 'CONNECTING' // Establishing transport connection to MCP server
71
+ | 'AUTHENTICATING' // OAuth flow in progress
72
+ | 'AUTHENTICATED' // OAuth complete, pre-connect
73
+ | 'DISCOVERING' // Discovering server capabilities (tools, resources, prompts)
74
+ | 'CONNECTED' // Transport connection established
75
+ | 'READY' // Fully connected and ready to use
76
+ | 'VALIDATING' // Validating existing session
77
+ | 'RECONNECTING' // Attempting to reconnect
78
+ | 'INITIALIZING' // Initializing session or connection
79
+ | 'FAILED'; // Connection error at some point
80
+
81
+ /**
82
+ * MCP Connection Event Types
83
+ * Discriminated union for type-safe event handling
84
+ */
85
+ export type McpConnectionEvent =
86
+ | {
87
+ type: 'state_changed';
88
+ sessionId: string;
89
+ serverId: string;
90
+ serverName: string;
91
+ state: McpConnectionState;
92
+ previousState: McpConnectionState;
93
+ timestamp: number;
94
+ }
95
+ | {
96
+ type: 'tools_discovered';
97
+ sessionId: string;
98
+ serverId: string;
99
+ toolCount: number;
100
+ tools: any[];
101
+ timestamp: number;
102
+ }
103
+ | {
104
+ type: 'auth_required';
105
+ sessionId: string;
106
+ serverId: string;
107
+ authUrl: string;
108
+ timestamp: number;
109
+ }
110
+ | {
111
+ type: 'error';
112
+ sessionId: string;
113
+ serverId: string;
114
+ error: string;
115
+ errorType: 'connection' | 'auth' | 'validation' | 'unknown';
116
+ timestamp: number;
117
+ }
118
+ | {
119
+ type: 'disconnected';
120
+ sessionId: string;
121
+ serverId: string;
122
+ reason?: string;
123
+ timestamp: number;
124
+ }
125
+ | {
126
+ type: 'progress';
127
+ sessionId: string;
128
+ serverId: string;
129
+ message: string;
130
+ timestamp: number;
131
+ };
132
+
133
+ /**
134
+ * Observability event for debugging and monitoring
135
+ */
136
+ export interface McpObservabilityEvent {
137
+ type?: string;
138
+ level?: 'debug' | 'info' | 'warn' | 'error';
139
+ message?: string;
140
+ displayMessage?: string;
141
+ sessionId?: string;
142
+ serverId?: string;
143
+ payload?: Record<string, any>;
144
+ metadata?: Record<string, any>; // Kept for backward compatibility
145
+ timestamp: number;
146
+ id?: string;
147
+ }
148
+
149
+ /**
150
+ * DisposableStore for managing multiple disposables
151
+ * Useful for cleanup in React hooks
152
+ */
153
+ export class DisposableStore {
154
+ private disposables: Set<Disposable> = new Set();
155
+
156
+ add(disposable: Disposable): void {
157
+ this.disposables.add(disposable);
158
+ }
159
+
160
+ dispose(): void {
161
+ for (const disposable of this.disposables) {
162
+ disposable.dispose();
163
+ }
164
+ this.disposables.clear();
165
+ }
166
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * MCP Redis Shared Package
3
+ * Shared types and utilities for both server and client
4
+ */
5
+
6
+ // Events
7
+ export {
8
+ Emitter,
9
+ DisposableStore,
10
+ type Disposable,
11
+ type Event,
12
+ type McpConnectionState,
13
+ type McpConnectionEvent,
14
+ type McpObservabilityEvent,
15
+ } from './events';
16
+
17
+ // Constants
18
+ export * from './constants';
19
+
20
+ // Errors
21
+ export * from './errors';
22
+
23
+ // Types
24
+ export type {
25
+ ToolInfo,
26
+ McpRpcRequest,
27
+ McpRpcResponse,
28
+ McpRpcMethod,
29
+ McpRpcParams,
30
+ TransportType,
31
+ // API types
32
+ ConnectRequest,
33
+ ConnectResponse,
34
+ ConnectSuccessResponse,
35
+ ConnectAuthRequiredResponse,
36
+ ConnectErrorResponse,
37
+ ListToolsResponse,
38
+ CallToolRequest,
39
+ CallToolResponse,
40
+ // RPC param types
41
+ ConnectParams,
42
+ DisconnectParams,
43
+ SessionParams,
44
+ CallToolParams,
45
+ GetPromptParams,
46
+ ReadResourceParams,
47
+ FinishAuthParams,
48
+ // RPC result types
49
+ SessionInfo,
50
+ SessionListResult,
51
+ ConnectResult,
52
+ DisconnectResult,
53
+ RestoreSessionResult,
54
+ FinishAuthResult,
55
+ ListToolsRpcResult,
56
+ ListPromptsResult,
57
+ ListResourcesResult,
58
+ } from './types';
59
+
60
+ export {
61
+ isConnectSuccess,
62
+ isConnectAuthRequired,
63
+ isConnectError,
64
+ isListToolsSuccess,
65
+ isCallToolSuccess,
66
+ } from './types';
67
+
68
+ // Utilities
69
+ export { sanitizeServerLabel } from './utils';
70
+
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Type definitions for MCP operations
3
+ */
4
+
5
+ import { Tool } from '@modelcontextprotocol/sdk/types.js';
6
+
7
+ // Connect API types
8
+ export interface ConnectRequest {
9
+ serverUrl: string;
10
+ callbackUrl: string;
11
+ }
12
+
13
+ export interface ConnectSuccessResponse {
14
+ success: true;
15
+ sessionId: string;
16
+ }
17
+
18
+ export interface ConnectAuthRequiredResponse {
19
+ requiresAuth: true;
20
+ authUrl: string;
21
+ sessionId: string;
22
+ }
23
+
24
+ export interface ConnectErrorResponse {
25
+ error: string;
26
+ }
27
+
28
+ export type ConnectResponse =
29
+ | ConnectSuccessResponse
30
+ | ConnectAuthRequiredResponse
31
+ | ConnectErrorResponse;
32
+
33
+ // Callback API types
34
+ export interface CallbackSuccessResponse {
35
+ success: true;
36
+ message: string;
37
+ }
38
+
39
+ export interface CallbackErrorResponse {
40
+ error: string;
41
+ }
42
+
43
+ export type CallbackResponse = CallbackSuccessResponse | CallbackErrorResponse;
44
+
45
+ // Disconnect API types
46
+ export interface DisconnectRequest {
47
+ sessionId: string;
48
+ }
49
+
50
+ export interface DisconnectSuccessResponse {
51
+ success: true;
52
+ message: string;
53
+ }
54
+
55
+ export interface DisconnectErrorResponse {
56
+ error: string;
57
+ }
58
+
59
+ export type DisconnectResponse =
60
+ | DisconnectSuccessResponse
61
+ | DisconnectErrorResponse;
62
+
63
+ // List Tools API types
64
+ export interface ListToolsSuccessResponse {
65
+ tools: Tool[];
66
+ }
67
+
68
+ export interface ListToolsErrorResponse {
69
+ error: string;
70
+ }
71
+
72
+ export type ListToolsResponse =
73
+ | ListToolsSuccessResponse
74
+ | ListToolsErrorResponse;
75
+
76
+ // Call Tool API types
77
+ export interface CallToolRequest {
78
+ sessionId: string;
79
+ toolName: string;
80
+ toolArgs: Record<string, unknown>;
81
+ }
82
+
83
+ export interface CallToolSuccessResponse {
84
+ content: Array<{
85
+ type: string;
86
+ text?: string;
87
+ [key: string]: unknown;
88
+ }>;
89
+ isError: boolean;
90
+ }
91
+
92
+ export interface CallToolErrorResponse {
93
+ error: string;
94
+ }
95
+
96
+ export type CallToolResponse =
97
+ | CallToolSuccessResponse
98
+ | CallToolErrorResponse;
99
+
100
+ // Helper type guards
101
+ export function isConnectSuccess(
102
+ response: ConnectResponse
103
+ ): response is ConnectSuccessResponse {
104
+ return 'success' in response && response.success === true;
105
+ }
106
+
107
+ export function isConnectAuthRequired(
108
+ response: ConnectResponse
109
+ ): response is ConnectAuthRequiredResponse {
110
+ return 'requiresAuth' in response && response.requiresAuth === true;
111
+ }
112
+
113
+ export function isConnectError(
114
+ response: ConnectResponse
115
+ ): response is ConnectErrorResponse {
116
+ return 'error' in response;
117
+ }
118
+
119
+ export function isListToolsSuccess(
120
+ response: ListToolsResponse
121
+ ): response is ListToolsSuccessResponse {
122
+ return 'tools' in response;
123
+ }
124
+
125
+ export function isCallToolSuccess(
126
+ response: CallToolResponse
127
+ ): response is CallToolSuccessResponse {
128
+ return 'content' in response;
129
+ }
130
+
131
+ // Generic tool info type
132
+ export type ToolInfo = {
133
+ name: string;
134
+ description?: string;
135
+ inputSchema?: unknown;
136
+ };
137
+
138
+ // Transport type
139
+ export type TransportType = 'sse' | 'streamable_http';
140
+
141
+ // SSE/RPC types
142
+ export type McpRpcMethod =
143
+ | 'connect'
144
+ | 'disconnect'
145
+ | 'listTools'
146
+ | 'callTool'
147
+ | 'getSessions'
148
+ | 'restoreSession'
149
+ | 'finishAuth'
150
+ | 'listPrompts'
151
+ | 'getPrompt'
152
+ | 'listResources'
153
+ | 'readResource';
154
+
155
+ export interface McpRpcRequest {
156
+ id: string;
157
+ method: McpRpcMethod;
158
+ params?: McpRpcParams;
159
+ }
160
+
161
+ export interface McpRpcResponse<T = unknown> {
162
+ id: string;
163
+ result?: T;
164
+ error?: {
165
+ code: string;
166
+ message: string;
167
+ };
168
+ }
169
+
170
+ // RPC Parameter Types
171
+ export interface ConnectParams {
172
+ serverId: string;
173
+ serverName: string;
174
+ serverUrl: string;
175
+ callbackUrl: string;
176
+ transportType?: TransportType;
177
+ }
178
+
179
+ export interface DisconnectParams {
180
+ sessionId: string;
181
+ }
182
+
183
+ export interface SessionParams {
184
+ sessionId: string;
185
+ }
186
+
187
+ export interface CallToolParams {
188
+ sessionId: string;
189
+ toolName: string;
190
+ toolArgs: Record<string, unknown>;
191
+ }
192
+
193
+ export interface GetPromptParams {
194
+ sessionId: string;
195
+ name: string;
196
+ args?: Record<string, string>;
197
+ }
198
+
199
+ export interface ReadResourceParams {
200
+ sessionId: string;
201
+ uri: string;
202
+ }
203
+
204
+ export interface FinishAuthParams {
205
+ sessionId: string;
206
+ code: string;
207
+ }
208
+
209
+ export type McpRpcParams =
210
+ | ConnectParams
211
+ | DisconnectParams
212
+ | SessionParams
213
+ | CallToolParams
214
+ | GetPromptParams
215
+ | ReadResourceParams
216
+ | FinishAuthParams
217
+ | undefined;
218
+
219
+ // RPC Result Types
220
+ export interface SessionInfo {
221
+ sessionId: string;
222
+ serverId?: string;
223
+ serverName?: string;
224
+ serverUrl: string;
225
+ transport: TransportType;
226
+ }
227
+
228
+ export interface SessionListResult {
229
+ sessions: SessionInfo[];
230
+ }
231
+
232
+ export interface ConnectResult {
233
+ sessionId: string;
234
+ success: boolean;
235
+ }
236
+
237
+ export interface DisconnectResult {
238
+ success: boolean;
239
+ }
240
+
241
+ export interface RestoreSessionResult {
242
+ success: boolean;
243
+ toolCount: number;
244
+ }
245
+
246
+ export interface FinishAuthResult {
247
+ success: boolean;
248
+ toolCount: number;
249
+ }
250
+
251
+ export interface ListToolsRpcResult {
252
+ tools: Tool[];
253
+ }
254
+
255
+ export interface ListPromptsResult {
256
+ prompts: Array<{
257
+ name: string;
258
+ description?: string;
259
+ arguments?: Array<{
260
+ name: string;
261
+ description?: string;
262
+ required?: boolean;
263
+ }>;
264
+ }>;
265
+ }
266
+
267
+ export interface ListResourcesResult {
268
+ resources: Array<{
269
+ uri: string;
270
+ name: string;
271
+ description?: string;
272
+ mimeType?: string;
273
+ }>;
274
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Sanitize server name to create a valid server label
3
+ * Must start with a letter and contain only letters, digits, '-' and '_'
4
+ */
5
+ export function sanitizeServerLabel(name: string): string {
6
+ let sanitized = name
7
+ .replace(/[^a-zA-Z0-9-_]/g, '_')
8
+ .replace(/_{2,}/g, '_')
9
+ .toLowerCase();
10
+
11
+ if (!/^[a-zA-Z]/.test(sanitized)) {
12
+ sanitized = 's_' + sanitized;
13
+ }
14
+
15
+ return sanitized;
16
+ }