@mcp-ts/sdk 2.5.2 → 2.6.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 (73) hide show
  1. package/README.md +3 -574
  2. package/dist/adapters/agui-adapter.d.mts +4 -4
  3. package/dist/adapters/agui-adapter.d.ts +4 -4
  4. package/dist/adapters/agui-middleware.d.mts +4 -4
  5. package/dist/adapters/agui-middleware.d.ts +4 -4
  6. package/dist/adapters/ai-adapter.d.mts +4 -4
  7. package/dist/adapters/ai-adapter.d.ts +4 -4
  8. package/dist/adapters/langchain-adapter.d.mts +4 -4
  9. package/dist/adapters/langchain-adapter.d.ts +4 -4
  10. package/dist/adapters/mastra-adapter.d.mts +3 -3
  11. package/dist/adapters/mastra-adapter.d.ts +3 -3
  12. package/dist/client/index.d.mts +2 -2
  13. package/dist/client/index.d.ts +2 -2
  14. package/dist/client/index.js +3 -0
  15. package/dist/client/index.js.map +1 -1
  16. package/dist/client/index.mjs +3 -0
  17. package/dist/client/index.mjs.map +1 -1
  18. package/dist/client/react.d.mts +10 -18
  19. package/dist/client/react.d.ts +10 -18
  20. package/dist/client/react.js +17 -0
  21. package/dist/client/react.js.map +1 -1
  22. package/dist/client/react.mjs +17 -0
  23. package/dist/client/react.mjs.map +1 -1
  24. package/dist/client/vue.d.mts +4 -4
  25. package/dist/client/vue.d.ts +4 -4
  26. package/dist/client/vue.js +3 -0
  27. package/dist/client/vue.js.map +1 -1
  28. package/dist/client/vue.mjs +3 -0
  29. package/dist/client/vue.mjs.map +1 -1
  30. package/dist/{index-B3GPsPsi.d.mts → index-BrDkbut5.d.ts} +2 -1
  31. package/dist/{index-gNdSQTSz.d.ts → index-DHQvlx4K.d.mts} +2 -1
  32. package/dist/index.d.mts +5 -5
  33. package/dist/index.d.ts +5 -5
  34. package/dist/index.js +1056 -863
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +1048 -858
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/{multi-session-client-CB4oDrQX.d.ts → multi-session-client-CQzymvHl.d.ts} +183 -227
  39. package/dist/{multi-session-client-xj3iQIv6.d.mts → multi-session-client-C_Ja2TuV.d.mts} +183 -227
  40. package/dist/server/index.d.mts +338 -88
  41. package/dist/server/index.d.ts +338 -88
  42. package/dist/server/index.js +1054 -864
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +1046 -859
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/shared/index.d.mts +4 -4
  47. package/dist/shared/index.d.ts +4 -4
  48. package/dist/shared/index.js.map +1 -1
  49. package/dist/shared/index.mjs.map +1 -1
  50. package/dist/{tool-router-CsKVXbQB.d.mts → tool-router-C1n7OXbl.d.mts} +1 -1
  51. package/dist/{tool-router-C-Mw1_BQ.d.ts → tool-router-CBIawFnt.d.ts} +1 -1
  52. package/dist/{types-6SmXege4.d.mts → types-DX71u9gR.d.mts} +11 -3
  53. package/dist/{types-6SmXege4.d.ts → types-DX71u9gR.d.ts} +11 -3
  54. package/migrations/neon/20260513010000_install_mcp_sessions.sql +4 -34
  55. package/migrations/supabase/20260330195700_install_mcp_sessions.sql +5 -62
  56. package/package.json +2 -1
  57. package/src/client/core/sse-client.ts +5 -0
  58. package/src/client/react/use-mcp.ts +27 -28
  59. package/src/server/handlers/sse-handler.ts +671 -629
  60. package/src/server/index.ts +2 -1
  61. package/src/server/mcp/multi-session-client.ts +34 -10
  62. package/src/server/mcp/oauth-client.ts +197 -205
  63. package/src/server/mcp/storage-oauth-provider.ts +149 -29
  64. package/src/server/mcp/tool-policy-gateway.ts +11 -1
  65. package/src/server/storage/file-backend.ts +25 -21
  66. package/src/server/storage/index.ts +71 -0
  67. package/src/server/storage/memory-backend.ts +24 -12
  68. package/src/server/storage/neon-backend.ts +70 -72
  69. package/src/server/storage/redis-backend.ts +26 -36
  70. package/src/server/storage/sqlite-backend.ts +25 -39
  71. package/src/server/storage/supabase-backend.ts +45 -54
  72. package/src/server/storage/types.ts +22 -2
  73. package/src/shared/types.ts +13 -1
@@ -6,7 +6,7 @@
6
6
  /** Core MCP client and session management */
7
7
  export { MCPClient } from './mcp/oauth-client.js';
8
8
  export { UnauthorizedError } from '../shared/errors.js';
9
- export { sessions, onSessionMutation, type SessionStore } from './storage/index.js';
9
+ export { sessions, onSessionMutation, withDbObservability, type SessionStore } from './storage/index.js';
10
10
  export { StorageOAuthClientProvider } from './mcp/storage-oauth-provider.js';
11
11
  export { MultiSessionClient } from './mcp/multi-session-client.js';
12
12
 
@@ -20,6 +20,7 @@ export { createNextMcpHandler, type NextMcpHandlerOptions } from './handlers/nex
20
20
 
21
21
  /** Utilities */
22
22
  export { sanitizeServerLabel } from '../shared/utils';
23
+ export { encryptObject, decryptObject } from './storage/crypto.js';
23
24
 
24
25
  /** Re-export shared types */
25
26
  export type {
@@ -1,5 +1,5 @@
1
1
  import { MCPClient } from './oauth-client.js';
2
- import { sessions, type Session } from '../storage/index.js';
2
+ import { sessions, withDbObservability, type Session, type SessionStore } from '../storage/index.js';
3
3
  import type { ToolClient, ToolClientProvider } from '../../shared/types.js';
4
4
  import { createToolPolicyGateway } from './tool-policy-gateway.js';
5
5
 
@@ -35,6 +35,13 @@ export interface MultiSessionOptions {
35
35
  */
36
36
  retryDelay?: number;
37
37
 
38
+ /**
39
+ * Custom session store. When provided, all DB operations go through
40
+ * this store instead of the default global `sessions` singleton.
41
+ * Useful for wrapping with `withDbObservability()` for debugging.
42
+ */
43
+ sessionStore?: SessionStore;
44
+
38
45
  /**
39
46
  * Custom session provider. When provided, `connect()` calls this
40
47
  * instead of querying the storage backend. Useful when sessions are
@@ -45,6 +52,12 @@ export interface MultiSessionOptions {
45
52
  */
46
53
  sessionProvider?: () => Promise<Session[]>;
47
54
 
55
+ /**
56
+ * Attached to each MCPClient before connect() so all connection lifecycle
57
+ * events (INITIALIZING, CONNECTING, CONNECTED, etc.) are captured.
58
+ */
59
+ onObservabilityEvent?: McpObservabilityEventHandler;
60
+
48
61
  /**
49
62
  * Called after a session is successfully connected.
50
63
  */
@@ -62,6 +75,9 @@ export interface MultiSessionOptions {
62
75
  onSessionFailed?: (sessionId: string, error: unknown) => void;
63
76
  }
64
77
 
78
+ /** @internal */
79
+ type McpObservabilityEventHandler = (event: import('../../shared/events.js').McpObservabilityEvent) => void;
80
+
65
81
  // ---------------------------------------------------------------------------
66
82
  // MultiSessionClient
67
83
  // ---------------------------------------------------------------------------
@@ -81,7 +97,7 @@ export class MultiSessionClient implements ToolClientProvider {
81
97
  private connectionPromises = new Map<string, Promise<void>>();
82
98
  private userId: string;
83
99
  private options: Required<Pick<MultiSessionOptions, 'timeout' | 'maxRetries' | 'retryDelay'>> &
84
- Pick<MultiSessionOptions, 'sessionProvider' | 'onSessionConnected' | 'onSessionEvicted' | 'onSessionFailed'>;
100
+ Pick<MultiSessionOptions, 'sessionProvider' | 'onObservabilityEvent' | 'onSessionConnected' | 'onSessionEvicted' | 'onSessionFailed'>;
85
101
 
86
102
  /**
87
103
  * @param userId - Unique identifier for the user (e.g. user ID or email).
@@ -95,8 +111,14 @@ export class MultiSessionClient implements ToolClientProvider {
95
111
  retryDelay: DEFAULT_RETRY_DELAY_MS,
96
112
  ...options,
97
113
  };
114
+
115
+ this._store = options.onObservabilityEvent
116
+ ? withDbObservability(options.sessionStore ?? sessions, options.onObservabilityEvent)
117
+ : (options.sessionStore ?? sessions);
98
118
  }
99
119
 
120
+ private _store: SessionStore;
121
+
100
122
  // -----------------------------------------------------------------------
101
123
  // Public API
102
124
  // -----------------------------------------------------------------------
@@ -112,12 +134,6 @@ export class MultiSessionClient implements ToolClientProvider {
112
134
  const sessions = await this.fetchActiveSessions();
113
135
  const activeSessionIds = new Set(sessions.map(s => s.sessionId));
114
136
 
115
- // Evict clients whose sessions no longer appear in the active list.
116
- // Without this, a stale MCPClient with a live SDK transport would
117
- // stay in the clients array after its session was deleted externally
118
- // (e.g. via the SSE handler's clearSession()), causing OAuth refreshes
119
- // to fail with a FK violation when they try to patchCredentials()
120
- // against the now-deleted session.
121
137
  for (const client of this.clients) {
122
138
  if (!activeSessionIds.has(client.getSessionId())) {
123
139
  this.options.onSessionEvicted?.(client.getSessionId());
@@ -196,13 +212,14 @@ export class MultiSessionClient implements ToolClientProvider {
196
212
  private async fetchActiveSessions(): Promise<Session[]> {
197
213
  const sessionList = this.options.sessionProvider
198
214
  ? await this.options.sessionProvider()
199
- : await sessions.list(this.userId);
215
+ : await this._store.list(this.userId);
200
216
 
201
217
  return sessionList.filter(s =>
202
218
  s.serverId &&
203
219
  s.serverUrl &&
204
220
  s.callbackUrl &&
205
- s.status === 'active'
221
+ s.status === 'active' &&
222
+ s.enabled !== false
206
223
  );
207
224
  }
208
225
 
@@ -286,8 +303,15 @@ export class MultiSessionClient implements ToolClientProvider {
286
303
  serverName: session.serverName,
287
304
  transportType: session.transportType,
288
305
  headers: session.headers,
306
+ hasSession: true,
307
+ sessionStore: this._store,
289
308
  });
290
309
 
310
+ // Attach observability listener BEFORE connect to capture all lifecycle events
311
+ if (this.options.onObservabilityEvent) {
312
+ client.onObservabilityEvent(this.options.onObservabilityEvent);
313
+ }
314
+
291
315
  const timeoutMs = this.options.timeout;
292
316
  let timeoutTimer: ReturnType<typeof setTimeout>;
293
317
  const timeoutPromise = new Promise<never>((_, reject) => {