@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 @@
1
+ {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.js","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { z } from 'zod';\r\n\r\nexport interface MastraAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Interface definition for a Mastra tool since we might not have the SDK installed.\r\n * Based on Mastra documentation.\r\n */\r\nexport interface MastraTool {\r\n id: string;\r\n description: string;\r\n inputSchema: z.ZodType<any>;\r\n execute: (args: any) => Promise<any>;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools within Mastra agents.\r\n */\r\nexport class MastraAdapter {\r\n private z: typeof z | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: MastraAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Lazy-loads Zod dependency\r\n */\r\n private async ensureZod() {\r\n if (!this.z) {\r\n try {\r\n const zod = await import('zod');\r\n this.z = zod.z;\r\n } catch (error) {\r\n throw new Error(\r\n 'zod is not installed. Install with:\\n' +\r\n ' npm install zod'\r\n );\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\r\n if (!client.isConnected()) {\r\n return {};\r\n }\r\n\r\n await this.ensureZod();\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? client.getServerId() ?? 'mcp';\r\n const tools: Record<string, MastraTool> = {};\r\n\r\n for (const tool of result.tools) {\r\n const toolName = `${prefix}_${tool.name}`;\r\n\r\n // In a real implementation, you would use a library like 'json-schema-to-zod'\r\n const schema = this.jsonSchemaToZod(tool.inputSchema);\r\n\r\n tools[toolName] = {\r\n id: toolName,\r\n description: tool.description || `Tool ${tool.name}`,\r\n inputSchema: schema,\r\n execute: async (args: any) => {\r\n return await client.callTool(tool.name, args);\r\n },\r\n };\r\n }\r\n\r\n return tools;\r\n }\r\n\r\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\r\n try {\r\n const { parseSchema } = require('json-schema-to-zod');\r\n const zodSchemaString = parseSchema(schema);\r\n // eslint-disable-next-line\r\n return new Function('z', 'return ' + zodSchemaString)(this.z);\r\n } catch (error) {\r\n // Fallback: Accept any object if conversion fails\r\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\r\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\r\n }\r\n }\r\n\r\n /**\r\n * Fetches tools from the MCP server and converts them to Mastra tools.\r\n */\r\n async getTools(): Promise<Record<string, MastraTool>> {\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\r\n return {};\r\n }\r\n })\r\n );\r\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\r\n return new MastraAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,93 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined") return require.apply(this, arguments);
7
+ throw Error('Dynamic require of "' + x + '" is not supported');
8
+ });
9
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
10
+
11
+ // src/adapters/mastra-adapter.ts
12
+ var MastraAdapter = class _MastraAdapter {
13
+ constructor(client, options = {}) {
14
+ this.client = client;
15
+ this.options = options;
16
+ __publicField(this, "z");
17
+ }
18
+ /**
19
+ * Lazy-loads Zod dependency
20
+ */
21
+ async ensureZod() {
22
+ if (!this.z) {
23
+ try {
24
+ const zod = await import('zod');
25
+ this.z = zod.z;
26
+ } catch (error) {
27
+ throw new Error(
28
+ "zod is not installed. Install with:\n npm install zod"
29
+ );
30
+ }
31
+ }
32
+ }
33
+ async transformTools(client) {
34
+ if (!client.isConnected()) {
35
+ return {};
36
+ }
37
+ await this.ensureZod();
38
+ const result = await client.listTools();
39
+ const prefix = this.options.prefix ?? client.getServerId() ?? "mcp";
40
+ const tools = {};
41
+ for (const tool of result.tools) {
42
+ const toolName = `${prefix}_${tool.name}`;
43
+ const schema = this.jsonSchemaToZod(tool.inputSchema);
44
+ tools[toolName] = {
45
+ id: toolName,
46
+ description: tool.description || `Tool ${tool.name}`,
47
+ inputSchema: schema,
48
+ execute: async (args) => {
49
+ return await client.callTool(tool.name, args);
50
+ }
51
+ };
52
+ }
53
+ return tools;
54
+ }
55
+ jsonSchemaToZod(schema) {
56
+ try {
57
+ const { parseSchema } = __require("json-schema-to-zod");
58
+ const zodSchemaString = parseSchema(schema);
59
+ return new Function("z", "return " + zodSchemaString)(this.z);
60
+ } catch (error) {
61
+ console.warn("[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:", error);
62
+ return this.z.record(this.z.any()).optional().describe("Dynamic Input");
63
+ }
64
+ }
65
+ /**
66
+ * Fetches tools from the MCP server and converts them to Mastra tools.
67
+ */
68
+ async getTools() {
69
+ const isMultiSession = typeof this.client.getClients === "function";
70
+ const clients = isMultiSession ? this.client.getClients() : [this.client];
71
+ const results = await Promise.all(
72
+ clients.map(async (client) => {
73
+ try {
74
+ return await this.transformTools(client);
75
+ } catch (error) {
76
+ console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);
77
+ return {};
78
+ }
79
+ })
80
+ );
81
+ return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});
82
+ }
83
+ /**
84
+ * Convenience static method to fetch tools in a single line.
85
+ */
86
+ static async getTools(client, options = {}) {
87
+ return new _MastraAdapter(client, options).getTools();
88
+ }
89
+ };
90
+
91
+ export { MastraAdapter };
92
+ //# sourceMappingURL=mastra-adapter.mjs.map
93
+ //# sourceMappingURL=mastra-adapter.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/mastra-adapter.ts"],"names":[],"mappings":"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","file":"mastra-adapter.mjs","sourcesContent":["import { MCPClient } from '../server/mcp/oauth-client';\r\nimport { MultiSessionClient } from '../server/mcp/multi-session-client';\r\nimport type { z } from 'zod';\r\n\r\nexport interface MastraAdapterOptions {\r\n /** \r\n * Prefix for tool names to avoid collision with other tools.\r\n * Defaults to the client's serverId.\r\n */\r\n prefix?: string;\r\n}\r\n\r\n/**\r\n * Interface definition for a Mastra tool since we might not have the SDK installed.\r\n * Based on Mastra documentation.\r\n */\r\nexport interface MastraTool {\r\n id: string;\r\n description: string;\r\n inputSchema: z.ZodType<any>;\r\n execute: (args: any) => Promise<any>;\r\n}\r\n\r\n/**\r\n * Adapter to use MCP tools within Mastra agents.\r\n */\r\nexport class MastraAdapter {\r\n private z: typeof z | undefined;\r\n\r\n constructor(\r\n private client: MCPClient | MultiSessionClient,\r\n private options: MastraAdapterOptions = {}\r\n ) { }\r\n\r\n /**\r\n * Lazy-loads Zod dependency\r\n */\r\n private async ensureZod() {\r\n if (!this.z) {\r\n try {\r\n const zod = await import('zod');\r\n this.z = zod.z;\r\n } catch (error) {\r\n throw new Error(\r\n 'zod is not installed. Install with:\\n' +\r\n ' npm install zod'\r\n );\r\n }\r\n }\r\n }\r\n\r\n\r\n\r\n private async transformTools(client: MCPClient): Promise<Record<string, MastraTool>> {\r\n if (!client.isConnected()) {\r\n return {};\r\n }\r\n\r\n await this.ensureZod();\r\n\r\n const result = await client.listTools();\r\n const prefix = this.options.prefix ?? client.getServerId() ?? 'mcp';\r\n const tools: Record<string, MastraTool> = {};\r\n\r\n for (const tool of result.tools) {\r\n const toolName = `${prefix}_${tool.name}`;\r\n\r\n // In a real implementation, you would use a library like 'json-schema-to-zod'\r\n const schema = this.jsonSchemaToZod(tool.inputSchema);\r\n\r\n tools[toolName] = {\r\n id: toolName,\r\n description: tool.description || `Tool ${tool.name}`,\r\n inputSchema: schema,\r\n execute: async (args: any) => {\r\n return await client.callTool(tool.name, args);\r\n },\r\n };\r\n }\r\n\r\n return tools;\r\n }\r\n\r\n private jsonSchemaToZod(schema: any): z.ZodType<any> {\r\n try {\r\n const { parseSchema } = require('json-schema-to-zod');\r\n const zodSchemaString = parseSchema(schema);\r\n // eslint-disable-next-line\r\n return new Function('z', 'return ' + zodSchemaString)(this.z);\r\n } catch (error) {\r\n // Fallback: Accept any object if conversion fails\r\n console.warn('[MastraAdapter] Failed to convert JSON Schema to Zod, using fallback:', error);\r\n return this.z!.record(this.z!.any()).optional().describe(\"Dynamic Input\");\r\n }\r\n }\r\n\r\n /**\r\n * Fetches tools from the MCP server and converts them to Mastra tools.\r\n */\r\n async getTools(): Promise<Record<string, MastraTool>> {\r\n // Use duck typing instead of instanceof to handle module bundling issues\r\n const isMultiSession = typeof (this.client as any).getClients === 'function';\r\n const clients = isMultiSession\r\n ? (this.client as MultiSessionClient).getClients()\r\n : [this.client as MCPClient];\r\n\r\n const results = await Promise.all(\r\n clients.map(async (client) => {\r\n try {\r\n return await this.transformTools(client);\r\n } catch (error) {\r\n console.error(`[MastraAdapter] Failed to fetch tools from ${client.getServerId()}:`, error);\r\n return {};\r\n }\r\n })\r\n );\r\n return results.reduce((acc, tools) => ({ ...acc, ...tools }), {});\r\n }\r\n\r\n /**\r\n * Convenience static method to fetch tools in a single line.\r\n */\r\n static async getTools(client: MCPClient | MultiSessionClient, options: MastraAdapterOptions = {}): Promise<Record<string, MastraTool>> {\r\n return new MastraAdapter(client, options).getTools();\r\n }\r\n}\r\n"]}
@@ -0,0 +1,119 @@
1
+ import { M as McpConnectionEvent, d as McpObservabilityEvent } from '../events-BP6WyRNh.mjs';
2
+ export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, c as McpConnectionState } from '../events-BP6WyRNh.mjs';
3
+ import { s as SessionListResult, e as ConnectParams, h as ConnectResult, j as DisconnectResult, n as ListToolsRpcResult, r as RestoreSessionResult, k as FinishAuthResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-SbDlA2VX.mjs';
4
+ export { p as McpRpcRequest, q as McpRpcResponse, T as ToolInfo } from '../types-SbDlA2VX.mjs';
5
+ import '@modelcontextprotocol/sdk/types.js';
6
+
7
+ /**
8
+ * SSE Client for MCP Connections
9
+ * Browser-side client that connects to SSE endpoint
10
+ */
11
+
12
+ interface SSEClientOptions {
13
+ /**
14
+ * SSE endpoint URL
15
+ */
16
+ url: string;
17
+ /**
18
+ * User/Client identifier
19
+ */
20
+ identity: string;
21
+ /**
22
+ * Optional auth token
23
+ */
24
+ authToken?: string;
25
+ /**
26
+ * Connection event callback
27
+ */
28
+ onConnectionEvent?: (event: McpConnectionEvent) => void;
29
+ /**
30
+ * Observability event callback
31
+ */
32
+ onObservabilityEvent?: (event: McpObservabilityEvent) => void;
33
+ /**
34
+ * Connection status callback
35
+ */
36
+ onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;
37
+ }
38
+ /**
39
+ * SSE Client for real-time MCP connection management
40
+ */
41
+ declare class SSEClient {
42
+ private options;
43
+ private eventSource;
44
+ private pendingRequests;
45
+ private reconnectAttempts;
46
+ private maxReconnectAttempts;
47
+ private reconnectDelay;
48
+ private isManuallyDisconnected;
49
+ private connectionPromise;
50
+ private connectionResolver;
51
+ constructor(options: SSEClientOptions);
52
+ /**
53
+ * Connect to SSE endpoint
54
+ */
55
+ connect(): void;
56
+ /**
57
+ * Disconnect from SSE endpoint
58
+ */
59
+ disconnect(): void;
60
+ /**
61
+ * Send RPC request via SSE
62
+ * Note: SSE is unidirectional (server->client), so we need to send requests via POST
63
+ */
64
+ private sendRequest;
65
+ /**
66
+ * Handle RPC response
67
+ */
68
+ private handleRpcResponse;
69
+ /**
70
+ * Get all user sessions
71
+ */
72
+ getSessions(): Promise<SessionListResult>;
73
+ /**
74
+ * Connect to an MCP server
75
+ */
76
+ connectToServer(params: ConnectParams): Promise<ConnectResult>;
77
+ /**
78
+ * Disconnect from an MCP server
79
+ */
80
+ disconnectFromServer(sessionId: string): Promise<DisconnectResult>;
81
+ /**
82
+ * List tools from a session
83
+ */
84
+ listTools(sessionId: string): Promise<ListToolsRpcResult>;
85
+ /**
86
+ * Call a tool
87
+ */
88
+ callTool(sessionId: string, toolName: string, toolArgs: Record<string, unknown>): Promise<unknown>;
89
+ /**
90
+ * Refresh/validate a session
91
+ */
92
+ restoreSession(sessionId: string): Promise<RestoreSessionResult>;
93
+ /**
94
+ * Complete OAuth authorization
95
+ */
96
+ finishAuth(sessionId: string, code: string): Promise<FinishAuthResult>;
97
+ /**
98
+ * List available prompts
99
+ */
100
+ listPrompts(sessionId: string): Promise<ListPromptsResult>;
101
+ /**
102
+ * Get a specific prompt with arguments
103
+ */
104
+ getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown>;
105
+ /**
106
+ * List available resources
107
+ */
108
+ listResources(sessionId: string): Promise<ListResourcesResult>;
109
+ /**
110
+ * Read a specific resource
111
+ */
112
+ readResource(sessionId: string, uri: string): Promise<unknown>;
113
+ /**
114
+ * Check if connected
115
+ */
116
+ isConnected(): boolean;
117
+ }
118
+
119
+ export { McpConnectionEvent, McpObservabilityEvent, SSEClient, type SSEClientOptions };
@@ -0,0 +1,119 @@
1
+ import { M as McpConnectionEvent, d as McpObservabilityEvent } from '../events-BP6WyRNh.js';
2
+ export { D as Disposable, a as DisposableStore, E as Emitter, b as Event, c as McpConnectionState } from '../events-BP6WyRNh.js';
3
+ import { s as SessionListResult, e as ConnectParams, h as ConnectResult, j as DisconnectResult, n as ListToolsRpcResult, r as RestoreSessionResult, k as FinishAuthResult, L as ListPromptsResult, l as ListResourcesResult } from '../types-SbDlA2VX.js';
4
+ export { p as McpRpcRequest, q as McpRpcResponse, T as ToolInfo } from '../types-SbDlA2VX.js';
5
+ import '@modelcontextprotocol/sdk/types.js';
6
+
7
+ /**
8
+ * SSE Client for MCP Connections
9
+ * Browser-side client that connects to SSE endpoint
10
+ */
11
+
12
+ interface SSEClientOptions {
13
+ /**
14
+ * SSE endpoint URL
15
+ */
16
+ url: string;
17
+ /**
18
+ * User/Client identifier
19
+ */
20
+ identity: string;
21
+ /**
22
+ * Optional auth token
23
+ */
24
+ authToken?: string;
25
+ /**
26
+ * Connection event callback
27
+ */
28
+ onConnectionEvent?: (event: McpConnectionEvent) => void;
29
+ /**
30
+ * Observability event callback
31
+ */
32
+ onObservabilityEvent?: (event: McpObservabilityEvent) => void;
33
+ /**
34
+ * Connection status callback
35
+ */
36
+ onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;
37
+ }
38
+ /**
39
+ * SSE Client for real-time MCP connection management
40
+ */
41
+ declare class SSEClient {
42
+ private options;
43
+ private eventSource;
44
+ private pendingRequests;
45
+ private reconnectAttempts;
46
+ private maxReconnectAttempts;
47
+ private reconnectDelay;
48
+ private isManuallyDisconnected;
49
+ private connectionPromise;
50
+ private connectionResolver;
51
+ constructor(options: SSEClientOptions);
52
+ /**
53
+ * Connect to SSE endpoint
54
+ */
55
+ connect(): void;
56
+ /**
57
+ * Disconnect from SSE endpoint
58
+ */
59
+ disconnect(): void;
60
+ /**
61
+ * Send RPC request via SSE
62
+ * Note: SSE is unidirectional (server->client), so we need to send requests via POST
63
+ */
64
+ private sendRequest;
65
+ /**
66
+ * Handle RPC response
67
+ */
68
+ private handleRpcResponse;
69
+ /**
70
+ * Get all user sessions
71
+ */
72
+ getSessions(): Promise<SessionListResult>;
73
+ /**
74
+ * Connect to an MCP server
75
+ */
76
+ connectToServer(params: ConnectParams): Promise<ConnectResult>;
77
+ /**
78
+ * Disconnect from an MCP server
79
+ */
80
+ disconnectFromServer(sessionId: string): Promise<DisconnectResult>;
81
+ /**
82
+ * List tools from a session
83
+ */
84
+ listTools(sessionId: string): Promise<ListToolsRpcResult>;
85
+ /**
86
+ * Call a tool
87
+ */
88
+ callTool(sessionId: string, toolName: string, toolArgs: Record<string, unknown>): Promise<unknown>;
89
+ /**
90
+ * Refresh/validate a session
91
+ */
92
+ restoreSession(sessionId: string): Promise<RestoreSessionResult>;
93
+ /**
94
+ * Complete OAuth authorization
95
+ */
96
+ finishAuth(sessionId: string, code: string): Promise<FinishAuthResult>;
97
+ /**
98
+ * List available prompts
99
+ */
100
+ listPrompts(sessionId: string): Promise<ListPromptsResult>;
101
+ /**
102
+ * Get a specific prompt with arguments
103
+ */
104
+ getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown>;
105
+ /**
106
+ * List available resources
107
+ */
108
+ listResources(sessionId: string): Promise<ListResourcesResult>;
109
+ /**
110
+ * Read a specific resource
111
+ */
112
+ readResource(sessionId: string, uri: string): Promise<unknown>;
113
+ /**
114
+ * Check if connected
115
+ */
116
+ isConnected(): boolean;
117
+ }
118
+
119
+ export { McpConnectionEvent, McpObservabilityEvent, SSEClient, type SSEClientOptions };
@@ -0,0 +1,225 @@
1
+ 'use strict';
2
+
3
+ var nanoid = require('nanoid');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+ var SSEClient = class {
9
+ constructor(options) {
10
+ this.options = options;
11
+ __publicField(this, "eventSource", null);
12
+ __publicField(this, "pendingRequests", /* @__PURE__ */ new Map());
13
+ __publicField(this, "reconnectAttempts", 0);
14
+ __publicField(this, "maxReconnectAttempts", 5);
15
+ __publicField(this, "reconnectDelay", 1e3);
16
+ __publicField(this, "isManuallyDisconnected", false);
17
+ __publicField(this, "connectionPromise", null);
18
+ __publicField(this, "connectionResolver", null);
19
+ }
20
+ /**
21
+ * Connect to SSE endpoint
22
+ */
23
+ connect() {
24
+ if (this.eventSource) {
25
+ return;
26
+ }
27
+ this.isManuallyDisconnected = false;
28
+ this.options.onStatusChange?.("connecting");
29
+ this.connectionPromise = new Promise((resolve) => {
30
+ this.connectionResolver = resolve;
31
+ });
32
+ const url = new URL(this.options.url, typeof window !== "undefined" ? window.location.origin : void 0);
33
+ url.searchParams.set("identity", this.options.identity);
34
+ if (this.options.authToken) {
35
+ url.searchParams.set("token", this.options.authToken);
36
+ }
37
+ this.eventSource = new EventSource(url.toString());
38
+ this.eventSource.addEventListener("open", () => {
39
+ console.log("[SSEClient] Connected");
40
+ this.reconnectAttempts = 0;
41
+ this.options.onStatusChange?.("connected");
42
+ });
43
+ this.eventSource.addEventListener("connected", (e) => {
44
+ const data = JSON.parse(e.data);
45
+ console.log("[SSEClient] Server ready:", data);
46
+ if (this.connectionResolver) {
47
+ this.connectionResolver();
48
+ this.connectionResolver = null;
49
+ }
50
+ });
51
+ this.eventSource.addEventListener("connection", (e) => {
52
+ const event = JSON.parse(e.data);
53
+ this.options.onConnectionEvent?.(event);
54
+ });
55
+ this.eventSource.addEventListener("observability", (e) => {
56
+ const event = JSON.parse(e.data);
57
+ this.options.onObservabilityEvent?.(event);
58
+ });
59
+ this.eventSource.addEventListener("rpc-response", (e) => {
60
+ const response = JSON.parse(e.data);
61
+ this.handleRpcResponse(response);
62
+ });
63
+ this.eventSource.addEventListener("error", () => {
64
+ console.error("[SSEClient] Connection error");
65
+ this.options.onStatusChange?.("error");
66
+ if (!this.isManuallyDisconnected && this.reconnectAttempts < this.maxReconnectAttempts) {
67
+ this.reconnectAttempts++;
68
+ console.log(`[SSEClient] Reconnecting (attempt ${this.reconnectAttempts})...`);
69
+ setTimeout(() => {
70
+ this.disconnect();
71
+ this.connect();
72
+ }, this.reconnectDelay * this.reconnectAttempts);
73
+ }
74
+ });
75
+ }
76
+ /**
77
+ * Disconnect from SSE endpoint
78
+ */
79
+ disconnect() {
80
+ this.isManuallyDisconnected = true;
81
+ if (this.eventSource) {
82
+ this.eventSource.close();
83
+ this.eventSource = null;
84
+ }
85
+ this.connectionPromise = null;
86
+ this.connectionResolver = null;
87
+ for (const [id, { reject }] of this.pendingRequests.entries()) {
88
+ const error = new Error("Connection closed");
89
+ error.name = "ConnectionClosedError";
90
+ reject(error);
91
+ }
92
+ this.pendingRequests.clear();
93
+ this.options.onStatusChange?.("disconnected");
94
+ }
95
+ /**
96
+ * Send RPC request via SSE
97
+ * Note: SSE is unidirectional (server->client), so we need to send requests via POST
98
+ */
99
+ async sendRequest(method, params) {
100
+ if (this.connectionPromise) {
101
+ await this.connectionPromise;
102
+ }
103
+ const id = `rpc_${nanoid.nanoid(10)}`;
104
+ const request = {
105
+ id,
106
+ method,
107
+ params
108
+ };
109
+ const promise = new Promise((resolve, reject) => {
110
+ this.pendingRequests.set(id, { resolve, reject });
111
+ setTimeout(() => {
112
+ if (this.pendingRequests.has(id)) {
113
+ this.pendingRequests.delete(id);
114
+ reject(new Error("Request timeout"));
115
+ }
116
+ }, 3e4);
117
+ });
118
+ try {
119
+ const url = new URL(this.options.url, typeof window !== "undefined" ? window.location.origin : void 0);
120
+ url.searchParams.set("identity", this.options.identity);
121
+ await fetch(url.toString(), {
122
+ method: "POST",
123
+ headers: {
124
+ "Content-Type": "application/json",
125
+ ...this.options.authToken && { Authorization: `Bearer ${this.options.authToken}` }
126
+ },
127
+ body: JSON.stringify(request)
128
+ });
129
+ } catch (error) {
130
+ this.pendingRequests.delete(id);
131
+ throw error;
132
+ }
133
+ return promise;
134
+ }
135
+ /**
136
+ * Handle RPC response
137
+ */
138
+ handleRpcResponse(response) {
139
+ const pending = this.pendingRequests.get(response.id);
140
+ if (pending) {
141
+ this.pendingRequests.delete(response.id);
142
+ if (response.error) {
143
+ pending.reject(new Error(response.error.message));
144
+ } else {
145
+ pending.resolve(response.result);
146
+ }
147
+ }
148
+ }
149
+ /**
150
+ * Get all user sessions
151
+ */
152
+ async getSessions() {
153
+ return this.sendRequest("getSessions");
154
+ }
155
+ /**
156
+ * Connect to an MCP server
157
+ */
158
+ async connectToServer(params) {
159
+ return this.sendRequest("connect", params);
160
+ }
161
+ /**
162
+ * Disconnect from an MCP server
163
+ */
164
+ async disconnectFromServer(sessionId) {
165
+ return this.sendRequest("disconnect", { sessionId });
166
+ }
167
+ /**
168
+ * List tools from a session
169
+ */
170
+ async listTools(sessionId) {
171
+ return this.sendRequest("listTools", { sessionId });
172
+ }
173
+ /**
174
+ * Call a tool
175
+ */
176
+ async callTool(sessionId, toolName, toolArgs) {
177
+ return this.sendRequest("callTool", { sessionId, toolName, toolArgs });
178
+ }
179
+ /**
180
+ * Refresh/validate a session
181
+ */
182
+ async restoreSession(sessionId) {
183
+ return this.sendRequest("restoreSession", { sessionId });
184
+ }
185
+ /**
186
+ * Complete OAuth authorization
187
+ */
188
+ async finishAuth(sessionId, code) {
189
+ return this.sendRequest("finishAuth", { sessionId, code });
190
+ }
191
+ /**
192
+ * List available prompts
193
+ */
194
+ async listPrompts(sessionId) {
195
+ return this.sendRequest("listPrompts", { sessionId });
196
+ }
197
+ /**
198
+ * Get a specific prompt with arguments
199
+ */
200
+ async getPrompt(sessionId, name, args) {
201
+ return this.sendRequest("getPrompt", { sessionId, name, args });
202
+ }
203
+ /**
204
+ * List available resources
205
+ */
206
+ async listResources(sessionId) {
207
+ return this.sendRequest("listResources", { sessionId });
208
+ }
209
+ /**
210
+ * Read a specific resource
211
+ */
212
+ async readResource(sessionId, uri) {
213
+ return this.sendRequest("readResource", { sessionId, uri });
214
+ }
215
+ /**
216
+ * Check if connected
217
+ */
218
+ isConnected() {
219
+ return this.eventSource !== null && this.eventSource.readyState === EventSource.OPEN;
220
+ }
221
+ };
222
+
223
+ exports.SSEClient = SSEClient;
224
+ //# sourceMappingURL=index.js.map
225
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/client/core/sse-client.ts"],"names":["nanoid"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * SSE Client for MCP Connections\r\n * Browser-side client that connects to SSE endpoint\r\n */\r\n\r\nimport { nanoid } from 'nanoid';\r\nimport type { McpConnectionEvent, McpObservabilityEvent } from '../../shared/events';\r\nimport type {\r\n McpRpcRequest,\r\n McpRpcResponse,\r\n McpRpcMethod,\r\n McpRpcParams,\r\n ConnectParams,\r\n SessionListResult,\r\n ConnectResult,\r\n DisconnectResult,\r\n RestoreSessionResult,\r\n FinishAuthResult,\r\n ListToolsRpcResult,\r\n ListPromptsResult,\r\n ListResourcesResult,\r\n} from '../../shared/types';\r\n\r\nexport interface SSEClientOptions {\r\n /**\r\n * SSE endpoint URL\r\n */\r\n url: string;\r\n\r\n /**\r\n * User/Client identifier\r\n */\r\n identity: string;\r\n\r\n /**\r\n * Optional auth token\r\n */\r\n authToken?: string;\r\n\r\n /**\r\n * Connection event callback\r\n */\r\n onConnectionEvent?: (event: McpConnectionEvent) => void;\r\n\r\n /**\r\n * Observability event callback\r\n */\r\n onObservabilityEvent?: (event: McpObservabilityEvent) => void;\r\n\r\n /**\r\n * Connection status callback\r\n */\r\n onStatusChange?: (status: 'connecting' | 'connected' | 'disconnected' | 'error') => void;\r\n}\r\n\r\n/**\r\n * SSE Client for real-time MCP connection management\r\n */\r\nexport class SSEClient {\r\n private eventSource: EventSource | null = null;\r\n private pendingRequests: Map<\r\n string,\r\n { resolve: (value: unknown) => void; reject: (error: Error) => void }\r\n > = new Map();\r\n private reconnectAttempts: number = 0;\r\n private maxReconnectAttempts: number = 5;\r\n private reconnectDelay: number = 1000;\r\n private isManuallyDisconnected: boolean = false;\r\n private connectionPromise: Promise<void> | null = null;\r\n private connectionResolver: (() => void) | null = null;\r\n\r\n constructor(private options: SSEClientOptions) { }\r\n\r\n /**\r\n * Connect to SSE endpoint\r\n */\r\n connect(): void {\r\n if (this.eventSource) {\r\n return; // Already connected\r\n }\r\n\r\n this.isManuallyDisconnected = false;\r\n this.options.onStatusChange?.('connecting');\r\n\r\n // Create connection promise\r\n this.connectionPromise = new Promise((resolve) => {\r\n this.connectionResolver = resolve;\r\n });\r\n\r\n // Build URL with query params\r\n // Handle both relative and absolute URLs\r\n const url = new URL(this.options.url, typeof window !== 'undefined' ? window.location.origin : undefined);\r\n url.searchParams.set('identity', this.options.identity);\r\n if (this.options.authToken) {\r\n url.searchParams.set('token', this.options.authToken);\r\n }\r\n\r\n // Create EventSource\r\n this.eventSource = new EventSource(url.toString());\r\n\r\n // Handle connection open\r\n this.eventSource.addEventListener('open', () => {\r\n console.log('[SSEClient] Connected');\r\n this.reconnectAttempts = 0;\r\n this.options.onStatusChange?.('connected');\r\n });\r\n\r\n // Handle 'connected' event - server confirms manager is ready\r\n this.eventSource.addEventListener('connected', (e: MessageEvent) => {\r\n const data = JSON.parse(e.data);\r\n console.log('[SSEClient] Server ready:', data);\r\n\r\n // Resolve connection promise - now safe to send requests\r\n if (this.connectionResolver) {\r\n this.connectionResolver();\r\n this.connectionResolver = null;\r\n }\r\n });\r\n\r\n // Handle 'connection' events (MCP connection state changes)\r\n this.eventSource.addEventListener('connection', (e: MessageEvent) => {\r\n const event: McpConnectionEvent = JSON.parse(e.data);\r\n this.options.onConnectionEvent?.(event);\r\n });\r\n\r\n // Handle 'observability' events (debugging/logging)\r\n this.eventSource.addEventListener('observability', (e: MessageEvent) => {\r\n const event: McpObservabilityEvent = JSON.parse(e.data);\r\n this.options.onObservabilityEvent?.(event);\r\n });\r\n\r\n // Handle 'rpc-response' events (RPC method responses)\r\n this.eventSource.addEventListener('rpc-response', (e: MessageEvent) => {\r\n const response: McpRpcResponse = JSON.parse(e.data);\r\n this.handleRpcResponse(response);\r\n });\r\n\r\n // Handle errors\r\n this.eventSource.addEventListener('error', () => {\r\n console.error('[SSEClient] Connection error');\r\n this.options.onStatusChange?.('error');\r\n\r\n // Attempt reconnection\r\n if (!this.isManuallyDisconnected && this.reconnectAttempts < this.maxReconnectAttempts) {\r\n this.reconnectAttempts++;\r\n console.log(`[SSEClient] Reconnecting (attempt ${this.reconnectAttempts})...`);\r\n\r\n setTimeout(() => {\r\n this.disconnect();\r\n this.connect();\r\n }, this.reconnectDelay * this.reconnectAttempts);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disconnect from SSE endpoint\r\n */\r\n disconnect(): void {\r\n this.isManuallyDisconnected = true;\r\n\r\n if (this.eventSource) {\r\n this.eventSource.close();\r\n this.eventSource = null;\r\n }\r\n\r\n // Reset connection promise\r\n this.connectionPromise = null;\r\n this.connectionResolver = null;\r\n\r\n // Reject all pending requests with a specific error type\r\n for (const [id, { reject }] of this.pendingRequests.entries()) {\r\n const error = new Error('Connection closed');\r\n error.name = 'ConnectionClosedError';\r\n reject(error);\r\n }\r\n this.pendingRequests.clear();\r\n\r\n this.options.onStatusChange?.('disconnected');\r\n }\r\n\r\n /**\r\n * Send RPC request via SSE\r\n * Note: SSE is unidirectional (server->client), so we need to send requests via POST\r\n */\r\n private async sendRequest<T = unknown>(method: McpRpcMethod, params?: McpRpcParams): Promise<T> {\r\n // Wait for connection to be fully established\r\n if (this.connectionPromise) {\r\n await this.connectionPromise;\r\n }\r\n\r\n // Generate unique request ID using nanoid (e.g., \"rpc_V1StGXR8_Z5jdHi\")\r\n const id = `rpc_${nanoid(10)}`;\r\n\r\n const request: McpRpcRequest = {\r\n id,\r\n method,\r\n params,\r\n };\r\n\r\n // Create promise for response\r\n const promise = new Promise<T>((resolve, reject) => {\r\n this.pendingRequests.set(id, { resolve: resolve as (value: unknown) => void, reject });\r\n\r\n // Timeout after 30 seconds\r\n setTimeout(() => {\r\n if (this.pendingRequests.has(id)) {\r\n this.pendingRequests.delete(id);\r\n reject(new Error('Request timeout'));\r\n }\r\n }, 30000);\r\n });\r\n\r\n // Send request via POST to same endpoint\r\n try {\r\n // Handle both relative and absolute URLs\r\n const url = new URL(this.options.url, typeof window !== 'undefined' ? window.location.origin : undefined);\r\n url.searchParams.set('identity', this.options.identity);\r\n\r\n await fetch(url.toString(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...(this.options.authToken && { Authorization: `Bearer ${this.options.authToken}` }),\r\n },\r\n body: JSON.stringify(request),\r\n });\r\n } catch (error) {\r\n this.pendingRequests.delete(id);\r\n throw error;\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n /**\r\n * Handle RPC response\r\n */\r\n private handleRpcResponse(response: McpRpcResponse): void {\r\n const pending = this.pendingRequests.get(response.id);\r\n\r\n if (pending) {\r\n this.pendingRequests.delete(response.id);\r\n\r\n if (response.error) {\r\n pending.reject(new Error(response.error.message));\r\n } else {\r\n pending.resolve(response.result);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get all user sessions\r\n */\r\n async getSessions(): Promise<SessionListResult> {\r\n return this.sendRequest<SessionListResult>('getSessions');\r\n }\r\n\r\n /**\r\n * Connect to an MCP server\r\n */\r\n async connectToServer(params: ConnectParams): Promise<ConnectResult> {\r\n return this.sendRequest<ConnectResult>('connect', params);\r\n }\r\n\r\n /**\r\n * Disconnect from an MCP server\r\n */\r\n async disconnectFromServer(sessionId: string): Promise<DisconnectResult> {\r\n return this.sendRequest<DisconnectResult>('disconnect', { sessionId });\r\n }\r\n\r\n /**\r\n * List tools from a session\r\n */\r\n async listTools(sessionId: string): Promise<ListToolsRpcResult> {\r\n return this.sendRequest<ListToolsRpcResult>('listTools', { sessionId });\r\n }\r\n\r\n /**\r\n * Call a tool\r\n */\r\n async callTool(\r\n sessionId: string,\r\n toolName: string,\r\n toolArgs: Record<string, unknown>\r\n ): Promise<unknown> {\r\n return this.sendRequest('callTool', { sessionId, toolName, toolArgs });\r\n }\r\n\r\n /**\r\n * Refresh/validate a session\r\n */\r\n async restoreSession(sessionId: string): Promise<RestoreSessionResult> {\r\n return this.sendRequest<RestoreSessionResult>('restoreSession', { sessionId });\r\n }\r\n\r\n /**\r\n * Complete OAuth authorization\r\n */\r\n async finishAuth(sessionId: string, code: string): Promise<FinishAuthResult> {\r\n return this.sendRequest<FinishAuthResult>('finishAuth', { sessionId, code });\r\n }\r\n\r\n /**\r\n * List available prompts\r\n */\r\n async listPrompts(sessionId: string): Promise<ListPromptsResult> {\r\n return this.sendRequest<ListPromptsResult>('listPrompts', { sessionId });\r\n }\r\n\r\n /**\r\n * Get a specific prompt with arguments\r\n */\r\n async getPrompt(sessionId: string, name: string, args?: Record<string, string>): Promise<unknown> {\r\n return this.sendRequest('getPrompt', { sessionId, name, args });\r\n }\r\n\r\n /**\r\n * List available resources\r\n */\r\n async listResources(sessionId: string): Promise<ListResourcesResult> {\r\n return this.sendRequest<ListResourcesResult>('listResources', { sessionId });\r\n }\r\n\r\n /**\r\n * Read a specific resource\r\n */\r\n async readResource(sessionId: string, uri: string): Promise<unknown> {\r\n return this.sendRequest('readResource', { sessionId, uri });\r\n }\r\n\r\n /**\r\n * Check if connected\r\n */\r\n isConnected(): boolean {\r\n return this.eventSource !== null && this.eventSource.readyState === EventSource.OPEN;\r\n }\r\n}\r\n"]}