@mcp-ts/sdk 2.4.5 → 2.5.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 (85) hide show
  1. package/dist/adapters/agui-adapter.d.mts +3 -3
  2. package/dist/adapters/agui-adapter.d.ts +3 -3
  3. package/dist/adapters/agui-adapter.js.map +1 -1
  4. package/dist/adapters/agui-adapter.mjs.map +1 -1
  5. package/dist/adapters/agui-middleware.d.mts +3 -3
  6. package/dist/adapters/agui-middleware.d.ts +3 -3
  7. package/dist/adapters/agui-middleware.js.map +1 -1
  8. package/dist/adapters/agui-middleware.mjs.map +1 -1
  9. package/dist/adapters/ai-adapter.d.mts +3 -3
  10. package/dist/adapters/ai-adapter.d.ts +3 -3
  11. package/dist/adapters/ai-adapter.js.map +1 -1
  12. package/dist/adapters/ai-adapter.mjs.map +1 -1
  13. package/dist/adapters/langchain-adapter.d.mts +3 -3
  14. package/dist/adapters/langchain-adapter.d.ts +3 -3
  15. package/dist/adapters/langchain-adapter.js +2 -2
  16. package/dist/adapters/langchain-adapter.js.map +1 -1
  17. package/dist/adapters/langchain-adapter.mjs +2 -2
  18. package/dist/adapters/langchain-adapter.mjs.map +1 -1
  19. package/dist/adapters/mastra-adapter.d.mts +2 -2
  20. package/dist/adapters/mastra-adapter.d.ts +2 -2
  21. package/dist/adapters/mastra-adapter.js +2 -2
  22. package/dist/adapters/mastra-adapter.js.map +1 -1
  23. package/dist/adapters/mastra-adapter.mjs +2 -2
  24. package/dist/adapters/mastra-adapter.mjs.map +1 -1
  25. package/dist/client/index.d.mts +2 -2
  26. package/dist/client/index.d.ts +2 -2
  27. package/dist/client/index.js +6 -0
  28. package/dist/client/index.js.map +1 -1
  29. package/dist/client/index.mjs +6 -0
  30. package/dist/client/index.mjs.map +1 -1
  31. package/dist/client/react.d.mts +15 -4
  32. package/dist/client/react.d.ts +15 -4
  33. package/dist/client/react.js +34 -0
  34. package/dist/client/react.js.map +1 -1
  35. package/dist/client/react.mjs +34 -0
  36. package/dist/client/react.mjs.map +1 -1
  37. package/dist/client/vue.d.mts +4 -4
  38. package/dist/client/vue.d.ts +4 -4
  39. package/dist/client/vue.js +6 -0
  40. package/dist/client/vue.js.map +1 -1
  41. package/dist/client/vue.mjs +6 -0
  42. package/dist/client/vue.mjs.map +1 -1
  43. package/dist/{index-CkM3p0eE.d.mts → index-CTURVnom.d.mts} +5 -1
  44. package/dist/{index-CZk2gu2E.d.ts → index-sVcqrhf7.d.ts} +5 -1
  45. package/dist/index.d.mts +4 -4
  46. package/dist/index.d.ts +4 -4
  47. package/dist/index.js +314 -82
  48. package/dist/index.js.map +1 -1
  49. package/dist/index.mjs +310 -82
  50. package/dist/index.mjs.map +1 -1
  51. package/dist/{multi-session-client-ChQrBZhF.d.mts → multi-session-client-CSPSHHla.d.ts} +14 -2
  52. package/dist/{multi-session-client-QOOPdEVp.d.ts → multi-session-client-DMZGVABI.d.mts} +14 -2
  53. package/dist/server/index.d.mts +13 -4
  54. package/dist/server/index.d.ts +13 -4
  55. package/dist/server/index.js +308 -82
  56. package/dist/server/index.js.map +1 -1
  57. package/dist/server/index.mjs +304 -82
  58. package/dist/server/index.mjs.map +1 -1
  59. package/dist/shared/index.d.mts +4 -4
  60. package/dist/shared/index.d.ts +4 -4
  61. package/dist/shared/index.js.map +1 -1
  62. package/dist/shared/index.mjs.map +1 -1
  63. package/dist/{tool-router-DQ-HrD7W.d.ts → tool-router-CS9l0w4a.d.ts} +1 -1
  64. package/dist/{tool-router-CGs3IDOJ.d.mts → tool-router-CVLBaCwH.d.mts} +1 -1
  65. package/dist/{types-Bf-7GOLW.d.mts → types-DK_NGWd4.d.mts} +37 -3
  66. package/dist/{types-Bf-7GOLW.d.ts → types-DK_NGWd4.d.ts} +37 -3
  67. package/migrations/neon/20260513010000_install_mcp_sessions.sql +1 -0
  68. package/migrations/supabase/20260330195700_install_mcp_sessions.sql +1 -0
  69. package/package.json +1 -1
  70. package/src/adapters/agui-adapter.ts +6 -2
  71. package/src/adapters/ai-adapter.ts +3 -1
  72. package/src/adapters/langchain-adapter.ts +5 -3
  73. package/src/adapters/mastra-adapter.ts +5 -3
  74. package/src/client/core/sse-client.ts +17 -0
  75. package/src/client/react/use-mcp.ts +63 -0
  76. package/src/server/handlers/sse-handler.ts +116 -9
  77. package/src/server/mcp/multi-session-client.ts +7 -3
  78. package/src/server/mcp/oauth-client.ts +25 -10
  79. package/src/server/mcp/tool-policy-gateway.ts +90 -0
  80. package/src/server/storage/neon-backend.ts +65 -60
  81. package/src/server/storage/session-lifecycle.ts +5 -0
  82. package/src/server/storage/supabase-backend.ts +27 -15
  83. package/src/server/storage/tool-policy.ts +89 -0
  84. package/src/server/storage/types.ts +11 -0
  85. package/src/shared/types.ts +48 -1
@@ -0,0 +1,89 @@
1
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
2
+ import type { ToolPolicy } from './types.js';
3
+
4
+ export type ToolPolicyInput = {
5
+ mode?: unknown;
6
+ toolIds?: unknown;
7
+ updatedAt?: unknown;
8
+ } | null | undefined;
9
+
10
+ export function createToolId(serverId: string, toolName: string): string {
11
+ return `${serverId}::${toolName}`;
12
+ }
13
+
14
+ function normalizeToolIds(input?: unknown): string[] {
15
+ if (!Array.isArray(input)) return [];
16
+
17
+ return Array.from(new Set(
18
+ input
19
+ .filter((id): id is string => typeof id === 'string')
20
+ .map((id) => id.trim())
21
+ .filter(Boolean)
22
+ ));
23
+ }
24
+
25
+ export function normalizeToolPolicy(input?: ToolPolicyInput, now = Date.now()): ToolPolicy | undefined {
26
+ if (!input || typeof input !== 'object') {
27
+ return undefined;
28
+ }
29
+
30
+ const mode = input.mode === 'allowlist' || input.mode === 'denylist'
31
+ ? input.mode
32
+ : 'all';
33
+ const updatedAt = typeof input.updatedAt === 'number' && Number.isFinite(input.updatedAt)
34
+ ? input.updatedAt
35
+ : now;
36
+
37
+ if (mode === 'all') {
38
+ return { mode: 'all', toolIds: [], updatedAt };
39
+ }
40
+
41
+ return { mode, toolIds: normalizeToolIds(input.toolIds), updatedAt };
42
+ }
43
+
44
+ export function normalizeToolPolicyForUpdate(input: ToolPolicyInput, now = Date.now()): ToolPolicy {
45
+ return normalizeToolPolicy(input, now) ?? { mode: 'all', toolIds: [], updatedAt: now };
46
+ }
47
+
48
+ export function isToolAllowed(policy: ToolPolicy | undefined, toolName: string, serverId?: string): boolean {
49
+ if (!policy || policy.mode === 'all') return true;
50
+ if (!serverId) return false;
51
+
52
+ const toolId = createToolId(serverId, toolName);
53
+ if (policy.mode === 'allowlist') {
54
+ return policy.toolIds.includes(toolId);
55
+ }
56
+
57
+ return !policy.toolIds.includes(toolId);
58
+ }
59
+
60
+ export function assertToolAllowed(policy: ToolPolicy | undefined, toolName: string, serverId?: string): void {
61
+ if (isToolAllowed(policy, toolName, serverId)) return;
62
+ throw new Error(`Tool "${toolName}" is not allowed for this MCP session`);
63
+ }
64
+
65
+ export function filterToolsByPolicy<T extends Pick<Tool, 'name'>>(
66
+ tools: T[],
67
+ policy: ToolPolicy | undefined,
68
+ serverId?: string
69
+ ): T[] {
70
+ if (!policy || policy.mode === 'all') return tools;
71
+ return tools.filter((tool) => isToolAllowed(policy, tool.name, serverId));
72
+ }
73
+
74
+ export function validateToolPolicyAgainstTools(
75
+ policy: ToolPolicy,
76
+ tools: Array<Pick<Tool, 'name'>>,
77
+ serverId?: string
78
+ ): void {
79
+ if (policy.mode === 'all') return;
80
+ if (!serverId) {
81
+ throw new Error('Cannot validate MCP tool policy without a serverId');
82
+ }
83
+
84
+ const availableIds = new Set(tools.map((tool) => createToolId(serverId, tool.name)));
85
+ const unknownIds = policy.toolIds.filter((id) => !availableIds.has(id));
86
+ if (unknownIds.length > 0) {
87
+ throw new Error(`Unknown tool id(s) for this MCP session: ${unknownIds.join(', ')}`);
88
+ }
89
+ }
@@ -14,6 +14,14 @@ export interface OAuthState {
14
14
 
15
15
  export type SessionStatus = 'pending' | 'active';
16
16
 
17
+ export type ToolPolicyMode = 'all' | 'allowlist' | 'denylist';
18
+
19
+ export interface ToolPolicy {
20
+ mode: ToolPolicyMode;
21
+ toolIds: string[];
22
+ updatedAt: number;
23
+ }
24
+
17
25
  export interface Session {
18
26
  sessionId: string;
19
27
  serverId?: string; // Database server ID for mapping
@@ -37,6 +45,7 @@ export interface Session {
37
45
  * - active: restorable session after successful connection/auth completion
38
46
  */
39
47
  status?: SessionStatus;
48
+ toolPolicy?: ToolPolicy;
40
49
  }
41
50
 
42
51
  export interface SessionCredentials {
@@ -158,3 +167,5 @@ export interface SessionStore {
158
167
  */
159
168
  disconnect(): Promise<void>;
160
169
  }
170
+
171
+
@@ -21,6 +21,7 @@ export interface ToolClient {
21
21
  callTool(name: string, args: Record<string, unknown>): Promise<any>;
22
22
  getServerId?(): string | undefined;
23
23
  getServerName?(): string | undefined;
24
+ getServerUrl?(): string | undefined;
24
25
  getSessionId?(): string;
25
26
  }
26
27
 
@@ -169,6 +170,13 @@ export type ToolInfo = {
169
170
  // Transport type
170
171
  export type TransportType = 'sse' | 'streamable-http';
171
172
  export type SessionStatus = 'pending' | 'active';
173
+ export type ToolPolicyMode = 'all' | 'allowlist' | 'denylist';
174
+
175
+ export interface ToolPolicy {
176
+ mode: ToolPolicyMode;
177
+ toolIds: string[];
178
+ updatedAt: number;
179
+ }
172
180
 
173
181
  // SSE/RPC types
174
182
  export type McpRpcMethod =
@@ -182,7 +190,9 @@ export type McpRpcMethod =
182
190
  | 'listPrompts'
183
191
  | 'getPrompt'
184
192
  | 'listResources'
185
- | 'readResource';
193
+ | 'readResource'
194
+ | 'setToolPolicy'
195
+ | 'getToolPolicy';
186
196
 
187
197
  export interface McpRpcRequest {
188
198
  id: string;
@@ -239,6 +249,18 @@ export interface FinishAuthParams {
239
249
  code: string;
240
250
  }
241
251
 
252
+ export interface SetToolPolicyParams {
253
+ sessionId: string;
254
+ toolPolicy: {
255
+ mode: ToolPolicyMode;
256
+ toolIds?: string[];
257
+ };
258
+ }
259
+
260
+ export interface GetToolPolicyParams {
261
+ sessionId: string;
262
+ }
263
+
242
264
  export type McpRpcParams =
243
265
  | ConnectParams
244
266
  | DisconnectParams
@@ -247,6 +269,8 @@ export type McpRpcParams =
247
269
  | GetPromptParams
248
270
  | ReadResourceParams
249
271
  | FinishAuthParams
272
+ | SetToolPolicyParams
273
+ | GetToolPolicyParams
250
274
  | undefined;
251
275
 
252
276
  // RPC Result Types
@@ -263,6 +287,7 @@ export interface SessionInfo {
263
287
  * `pending` means auth is in progress and should be resumed explicitly by user action.
264
288
  */
265
289
  status: SessionStatus;
290
+ toolPolicy?: ToolPolicy;
266
291
  }
267
292
 
268
293
  export interface SessionListResult {
@@ -292,6 +317,25 @@ export interface ListToolsRpcResult {
292
317
  tools: Tool[];
293
318
  }
294
319
 
320
+ export interface SetToolPolicyResult {
321
+ success: boolean;
322
+ toolPolicy: ToolPolicy;
323
+ tools: Tool[];
324
+ toolCount: number;
325
+ }
326
+
327
+ export type ToolAccessInfo = Tool & {
328
+ toolId: string;
329
+ allowed: boolean;
330
+ };
331
+
332
+ export interface GetToolPolicyResult {
333
+ toolPolicy: ToolPolicy;
334
+ tools: ToolAccessInfo[];
335
+ toolCount: number;
336
+ allowedToolCount: number;
337
+ }
338
+
295
339
  export interface ListPromptsResult {
296
340
  prompts: Array<{
297
341
  name: string;
@@ -314,3 +358,6 @@ export interface ListResourcesResult {
314
358
  }
315
359
 
316
360
  export type { CallToolResult };
361
+
362
+
363
+