@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.
- package/README.md +3 -574
- package/dist/adapters/agui-adapter.d.mts +4 -4
- package/dist/adapters/agui-adapter.d.ts +4 -4
- package/dist/adapters/agui-middleware.d.mts +4 -4
- package/dist/adapters/agui-middleware.d.ts +4 -4
- package/dist/adapters/ai-adapter.d.mts +4 -4
- package/dist/adapters/ai-adapter.d.ts +4 -4
- package/dist/adapters/langchain-adapter.d.mts +4 -4
- package/dist/adapters/langchain-adapter.d.ts +4 -4
- package/dist/adapters/mastra-adapter.d.mts +3 -3
- package/dist/adapters/mastra-adapter.d.ts +3 -3
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +3 -0
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/react.d.mts +10 -18
- package/dist/client/react.d.ts +10 -18
- package/dist/client/react.js +17 -0
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +17 -0
- package/dist/client/react.mjs.map +1 -1
- package/dist/client/vue.d.mts +4 -4
- package/dist/client/vue.d.ts +4 -4
- package/dist/client/vue.js +3 -0
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +3 -0
- package/dist/client/vue.mjs.map +1 -1
- package/dist/{index-B3GPsPsi.d.mts → index-BrDkbut5.d.ts} +2 -1
- package/dist/{index-gNdSQTSz.d.ts → index-DHQvlx4K.d.mts} +2 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1056 -863
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1048 -858
- package/dist/index.mjs.map +1 -1
- package/dist/{multi-session-client-CB4oDrQX.d.ts → multi-session-client-CQzymvHl.d.ts} +183 -227
- package/dist/{multi-session-client-xj3iQIv6.d.mts → multi-session-client-C_Ja2TuV.d.mts} +183 -227
- package/dist/server/index.d.mts +338 -88
- package/dist/server/index.d.ts +338 -88
- package/dist/server/index.js +1054 -864
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +1046 -859
- package/dist/server/index.mjs.map +1 -1
- package/dist/shared/index.d.mts +4 -4
- package/dist/shared/index.d.ts +4 -4
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/index.mjs.map +1 -1
- package/dist/{tool-router-CsKVXbQB.d.mts → tool-router-C1n7OXbl.d.mts} +1 -1
- package/dist/{tool-router-C-Mw1_BQ.d.ts → tool-router-CBIawFnt.d.ts} +1 -1
- package/dist/{types-6SmXege4.d.mts → types-DX71u9gR.d.mts} +11 -3
- package/dist/{types-6SmXege4.d.ts → types-DX71u9gR.d.ts} +11 -3
- package/migrations/neon/20260513010000_install_mcp_sessions.sql +4 -34
- package/migrations/supabase/20260330195700_install_mcp_sessions.sql +5 -62
- package/package.json +2 -1
- package/src/client/core/sse-client.ts +5 -0
- package/src/client/react/use-mcp.ts +27 -28
- package/src/server/handlers/sse-handler.ts +671 -629
- package/src/server/index.ts +2 -1
- package/src/server/mcp/multi-session-client.ts +34 -10
- package/src/server/mcp/oauth-client.ts +197 -205
- package/src/server/mcp/storage-oauth-provider.ts +149 -29
- package/src/server/mcp/tool-policy-gateway.ts +11 -1
- package/src/server/storage/file-backend.ts +25 -21
- package/src/server/storage/index.ts +71 -0
- package/src/server/storage/memory-backend.ts +24 -12
- package/src/server/storage/neon-backend.ts +70 -72
- package/src/server/storage/redis-backend.ts +26 -36
- package/src/server/storage/sqlite-backend.ts +25 -39
- package/src/server/storage/supabase-backend.ts +45 -54
- package/src/server/storage/types.ts +22 -2
- package/src/shared/types.ts +13 -1
package/src/server/index.ts
CHANGED
|
@@ -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
|
|
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) => {
|