@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.
- package/dist/adapters/agui-adapter.d.mts +3 -3
- package/dist/adapters/agui-adapter.d.ts +3 -3
- package/dist/adapters/agui-adapter.js.map +1 -1
- package/dist/adapters/agui-adapter.mjs.map +1 -1
- package/dist/adapters/agui-middleware.d.mts +3 -3
- package/dist/adapters/agui-middleware.d.ts +3 -3
- package/dist/adapters/agui-middleware.js.map +1 -1
- package/dist/adapters/agui-middleware.mjs.map +1 -1
- package/dist/adapters/ai-adapter.d.mts +3 -3
- package/dist/adapters/ai-adapter.d.ts +3 -3
- package/dist/adapters/ai-adapter.js.map +1 -1
- package/dist/adapters/ai-adapter.mjs.map +1 -1
- package/dist/adapters/langchain-adapter.d.mts +3 -3
- package/dist/adapters/langchain-adapter.d.ts +3 -3
- package/dist/adapters/langchain-adapter.js +2 -2
- package/dist/adapters/langchain-adapter.js.map +1 -1
- package/dist/adapters/langchain-adapter.mjs +2 -2
- package/dist/adapters/langchain-adapter.mjs.map +1 -1
- package/dist/adapters/mastra-adapter.d.mts +2 -2
- package/dist/adapters/mastra-adapter.d.ts +2 -2
- package/dist/adapters/mastra-adapter.js +2 -2
- package/dist/adapters/mastra-adapter.js.map +1 -1
- package/dist/adapters/mastra-adapter.mjs +2 -2
- package/dist/adapters/mastra-adapter.mjs.map +1 -1
- package/dist/client/index.d.mts +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +6 -0
- package/dist/client/index.mjs.map +1 -1
- package/dist/client/react.d.mts +15 -4
- package/dist/client/react.d.ts +15 -4
- package/dist/client/react.js +34 -0
- package/dist/client/react.js.map +1 -1
- package/dist/client/react.mjs +34 -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 +6 -0
- package/dist/client/vue.js.map +1 -1
- package/dist/client/vue.mjs +6 -0
- package/dist/client/vue.mjs.map +1 -1
- package/dist/{index-CkM3p0eE.d.mts → index-CTURVnom.d.mts} +5 -1
- package/dist/{index-CZk2gu2E.d.ts → index-sVcqrhf7.d.ts} +5 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +314 -82
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +310 -82
- package/dist/index.mjs.map +1 -1
- package/dist/{multi-session-client-ChQrBZhF.d.mts → multi-session-client-CSPSHHla.d.ts} +14 -2
- package/dist/{multi-session-client-QOOPdEVp.d.ts → multi-session-client-DMZGVABI.d.mts} +14 -2
- package/dist/server/index.d.mts +13 -4
- package/dist/server/index.d.ts +13 -4
- package/dist/server/index.js +308 -82
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +304 -82
- 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-DQ-HrD7W.d.ts → tool-router-CS9l0w4a.d.ts} +1 -1
- package/dist/{tool-router-CGs3IDOJ.d.mts → tool-router-CVLBaCwH.d.mts} +1 -1
- package/dist/{types-Bf-7GOLW.d.mts → types-DK_NGWd4.d.mts} +37 -3
- package/dist/{types-Bf-7GOLW.d.ts → types-DK_NGWd4.d.ts} +37 -3
- package/migrations/neon/20260513010000_install_mcp_sessions.sql +1 -0
- package/migrations/supabase/20260330195700_install_mcp_sessions.sql +1 -0
- package/package.json +1 -1
- package/src/adapters/agui-adapter.ts +6 -2
- package/src/adapters/ai-adapter.ts +3 -1
- package/src/adapters/langchain-adapter.ts +5 -3
- package/src/adapters/mastra-adapter.ts +5 -3
- package/src/client/core/sse-client.ts +17 -0
- package/src/client/react/use-mcp.ts +63 -0
- package/src/server/handlers/sse-handler.ts +116 -9
- package/src/server/mcp/multi-session-client.ts +7 -3
- package/src/server/mcp/oauth-client.ts +25 -10
- package/src/server/mcp/tool-policy-gateway.ts +90 -0
- package/src/server/storage/neon-backend.ts +65 -60
- package/src/server/storage/session-lifecycle.ts +5 -0
- package/src/server/storage/supabase-backend.ts +27 -15
- package/src/server/storage/tool-policy.ts +89 -0
- package/src/server/storage/types.ts +11 -0
- 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
|
+
|
package/src/shared/types.ts
CHANGED
|
@@ -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
|
+
|