toolception 0.5.4 → 0.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 +114 -0
- package/dist/core/DynamicToolManager.d.ts.map +1 -1
- package/dist/http/FastifyTransport.d.ts +40 -4
- package/dist/http/FastifyTransport.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +692 -429
- package/dist/index.js.map +1 -1
- package/dist/server/createMcpServer.d.ts +20 -1
- package/dist/server/createMcpServer.d.ts.map +1 -1
- package/dist/server/createPermissionBasedMcpServer.d.ts.map +1 -1
- package/dist/session/SessionContextResolver.d.ts +115 -0
- package/dist/session/SessionContextResolver.d.ts.map +1 -0
- package/dist/session/validateSessionContextConfig.d.ts +10 -0
- package/dist/session/validateSessionContextConfig.d.ts.map +1 -0
- package/dist/types/index.d.ts +119 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
-
import { ExposurePolicy, Mode, ModuleLoader, ToolSetCatalog } from '../types/index.js';
|
|
2
|
+
import { ExposurePolicy, Mode, ModuleLoader, SessionContextConfig, ToolSetCatalog } from '../types/index.js';
|
|
3
3
|
import { FastifyTransportOptions } from '../http/FastifyTransport.js';
|
|
4
4
|
export interface CreateMcpServerOptions {
|
|
5
5
|
catalog: ToolSetCatalog;
|
|
@@ -19,6 +19,25 @@ export interface CreateMcpServerOptions {
|
|
|
19
19
|
*/
|
|
20
20
|
createServer: () => McpServer;
|
|
21
21
|
configSchema?: object;
|
|
22
|
+
/**
|
|
23
|
+
* Optional per-session context configuration.
|
|
24
|
+
* Enables extracting context from query parameters and merging with base context
|
|
25
|
+
* on a per-request basis. Useful for multi-tenant scenarios.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* sessionContext: {
|
|
30
|
+
* enabled: true,
|
|
31
|
+
* queryParam: {
|
|
32
|
+
* name: 'config',
|
|
33
|
+
* encoding: 'base64',
|
|
34
|
+
* allowedKeys: ['API_TOKEN', 'USER_ID'],
|
|
35
|
+
* },
|
|
36
|
+
* merge: 'shallow',
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
sessionContext?: SessionContextConfig;
|
|
22
41
|
}
|
|
23
42
|
export declare function createMcpServer(options: CreateMcpServerOptions): Promise<{
|
|
24
43
|
server: McpServer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"createMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAC;AAKrC,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;KAAE,CAAC;IACvE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,MAAM,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;;;;;;;;;;;;OAiBG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAaD,wBAAsB,eAAe,CAAC,OAAO,EAAE,sBAAsB;;;;GA2IpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPermissionBasedMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createPermissionBasedMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,qCAAqC,EAEtC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"createPermissionBasedMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createPermissionBasedMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,qCAAqC,EAEtC,MAAM,mBAAmB,CAAC;AAqD3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,qCAAqC;;;;GA6G/C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { SessionContextConfig, SessionRequestContext } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Result of session context resolution including the merged context
|
|
4
|
+
* and a cache key suffix for differentiating sessions with different configs.
|
|
5
|
+
*/
|
|
6
|
+
export interface SessionContextResult {
|
|
7
|
+
/**
|
|
8
|
+
* The merged context to pass to module loaders.
|
|
9
|
+
*/
|
|
10
|
+
context: unknown;
|
|
11
|
+
/**
|
|
12
|
+
* A deterministic hash suffix based on the session config values.
|
|
13
|
+
* Used to differentiate cache entries: `${clientId}:${cacheKeySuffix}`
|
|
14
|
+
* Returns 'default' when no session config is present.
|
|
15
|
+
*/
|
|
16
|
+
cacheKeySuffix: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Resolves per-session context from request query parameters and merges
|
|
20
|
+
* it with the base server context.
|
|
21
|
+
*
|
|
22
|
+
* Features:
|
|
23
|
+
* - Parses query parameter (base64 or JSON encoded)
|
|
24
|
+
* - Filters allowed keys (whitelist enforcement)
|
|
25
|
+
* - Merges session context with base context (shallow or deep)
|
|
26
|
+
* - Generates cache key suffix for session differentiation
|
|
27
|
+
*
|
|
28
|
+
* Security considerations:
|
|
29
|
+
* - Always specify allowedKeys to whitelist permitted session config keys
|
|
30
|
+
* - Invalid encoding silently returns empty session config (fail secure)
|
|
31
|
+
* - Disallowed keys are filtered without logging (prevents info leakage)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const resolver = new SessionContextResolver({
|
|
36
|
+
* enabled: true,
|
|
37
|
+
* queryParam: {
|
|
38
|
+
* name: 'config',
|
|
39
|
+
* encoding: 'base64',
|
|
40
|
+
* allowedKeys: ['API_TOKEN', 'USER_ID'],
|
|
41
|
+
* },
|
|
42
|
+
* merge: 'shallow',
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* const result = resolver.resolve(
|
|
46
|
+
* { clientId: 'client-1', headers: {}, query: { config: 'eyJBUElfVE9LRU4iOiJ0b2tlbiJ9' } },
|
|
47
|
+
* { baseValue: 'foo' }
|
|
48
|
+
* );
|
|
49
|
+
* // result.context = { baseValue: 'foo', API_TOKEN: 'token' }
|
|
50
|
+
* // result.cacheKeySuffix = 'abc123...'
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare class SessionContextResolver {
|
|
54
|
+
private readonly config;
|
|
55
|
+
private readonly queryParamName;
|
|
56
|
+
private readonly encoding;
|
|
57
|
+
private readonly allowedKeys;
|
|
58
|
+
private readonly mergeStrategy;
|
|
59
|
+
constructor(config: SessionContextConfig);
|
|
60
|
+
/**
|
|
61
|
+
* Resolves the session context for a request.
|
|
62
|
+
*
|
|
63
|
+
* @param request - The request context (clientId, headers, query)
|
|
64
|
+
* @param baseContext - The base context from server configuration
|
|
65
|
+
* @returns The resolved context and cache key suffix
|
|
66
|
+
*/
|
|
67
|
+
resolve(request: SessionRequestContext, baseContext: unknown): SessionContextResult;
|
|
68
|
+
/**
|
|
69
|
+
* Parses the session config from query parameters.
|
|
70
|
+
* Returns empty object on parse failure (fail secure).
|
|
71
|
+
*
|
|
72
|
+
* @param query - Query parameters from the request
|
|
73
|
+
* @returns Parsed and filtered config object
|
|
74
|
+
* @private
|
|
75
|
+
*/
|
|
76
|
+
private parseQueryConfig;
|
|
77
|
+
/**
|
|
78
|
+
* Filters the parsed config to only include allowed keys.
|
|
79
|
+
* If no allowedKeys whitelist is configured, returns the full object.
|
|
80
|
+
*
|
|
81
|
+
* @param parsed - The parsed config object
|
|
82
|
+
* @returns Filtered config with only allowed keys
|
|
83
|
+
* @private
|
|
84
|
+
*/
|
|
85
|
+
private filterAllowedKeys;
|
|
86
|
+
/**
|
|
87
|
+
* Merges the base context with the session config.
|
|
88
|
+
*
|
|
89
|
+
* @param baseContext - The base context from server configuration
|
|
90
|
+
* @param sessionConfig - The parsed session config
|
|
91
|
+
* @returns Merged context
|
|
92
|
+
* @private
|
|
93
|
+
*/
|
|
94
|
+
private mergeContexts;
|
|
95
|
+
/**
|
|
96
|
+
* Performs a deep merge of two objects.
|
|
97
|
+
* Session config values override base context values.
|
|
98
|
+
*
|
|
99
|
+
* @param base - The base object
|
|
100
|
+
* @param override - The override object
|
|
101
|
+
* @returns Deep merged object
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
104
|
+
private deepMerge;
|
|
105
|
+
/**
|
|
106
|
+
* Generates a deterministic cache key suffix based on the session config.
|
|
107
|
+
* Returns 'default' when no session config is present.
|
|
108
|
+
*
|
|
109
|
+
* @param sessionConfig - The parsed session config
|
|
110
|
+
* @returns Hash string or 'default'
|
|
111
|
+
* @private
|
|
112
|
+
*/
|
|
113
|
+
private generateCacheKeySuffix;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=SessionContextResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionContextResolver.d.ts","sourceRoot":"","sources":["../../src/session/SessionContextResolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEvC,MAAM,EAAE,oBAAoB;IAUxC;;;;;;OAMG;IACH,OAAO,CACL,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,OAAO,GACnB,oBAAoB;IAyCvB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa;IAgCrB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IA+BjB;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;CAiB/B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { SessionContextConfig } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validates a session context configuration object to ensure it meets all requirements.
|
|
4
|
+
* Throws descriptive errors for any validation failures.
|
|
5
|
+
*
|
|
6
|
+
* @param config - The session context configuration to validate
|
|
7
|
+
* @throws {Error} If the configuration is invalid or has incorrect types
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateSessionContextConfig(config: SessionContextConfig): void;
|
|
10
|
+
//# sourceMappingURL=validateSessionContextConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateSessionContextConfig.d.ts","sourceRoot":"","sources":["../../src/session/validateSessionContextConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAM/E"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -4,6 +4,22 @@ export type McpToolDefinition = {
|
|
|
4
4
|
description: string;
|
|
5
5
|
inputSchema: Record<string, any>;
|
|
6
6
|
handler: (args: any) => Promise<any> | any;
|
|
7
|
+
/**
|
|
8
|
+
* Optional annotations providing hints about tool behavior.
|
|
9
|
+
* All annotations are hints and not guaranteed.
|
|
10
|
+
* - title: Optional display title for the tool
|
|
11
|
+
* - readOnlyHint: Tool does not modify its environment
|
|
12
|
+
* - destructiveHint: Tool may perform destructive updates
|
|
13
|
+
* - idempotentHint: Repeated calls with same arguments have no additional effect
|
|
14
|
+
* - openWorldHint: Tool interacts with external entities (APIs, web, etc.)
|
|
15
|
+
*/
|
|
16
|
+
annotations?: {
|
|
17
|
+
title?: string;
|
|
18
|
+
destructiveHint?: boolean;
|
|
19
|
+
idempotentHint?: boolean;
|
|
20
|
+
readOnlyHint?: boolean;
|
|
21
|
+
openWorldHint?: boolean;
|
|
22
|
+
};
|
|
7
23
|
};
|
|
8
24
|
export type ToolSetDefinition = {
|
|
9
25
|
name: string;
|
|
@@ -228,6 +244,109 @@ export type PermissionConfig = {
|
|
|
228
244
|
* };
|
|
229
245
|
* ```
|
|
230
246
|
*/
|
|
247
|
+
/**
|
|
248
|
+
* Configuration for per-session context that can be extracted from query parameters
|
|
249
|
+
* and merged with the base context on a per-request basis.
|
|
250
|
+
*
|
|
251
|
+
* This enables multi-tenant use cases where each client session can have its own
|
|
252
|
+
* context values (e.g., API tokens, user IDs) that are passed to module loaders.
|
|
253
|
+
*
|
|
254
|
+
* @example Basic usage with query parameter
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const options: SessionContextConfig = {
|
|
257
|
+
* enabled: true,
|
|
258
|
+
* queryParam: {
|
|
259
|
+
* name: 'config', // default
|
|
260
|
+
* encoding: 'base64', // default
|
|
261
|
+
* allowedKeys: ['API_TOKEN', 'USER_ID'], // whitelist (recommended)
|
|
262
|
+
* },
|
|
263
|
+
* merge: 'shallow', // default
|
|
264
|
+
* };
|
|
265
|
+
* // Client sends: ?config=BASE64_ENCODED_JSON
|
|
266
|
+
* ```
|
|
267
|
+
*
|
|
268
|
+
* @example With custom context resolver
|
|
269
|
+
* ```typescript
|
|
270
|
+
* const options: SessionContextConfig = {
|
|
271
|
+
* enabled: true,
|
|
272
|
+
* queryParam: {
|
|
273
|
+
* allowedKeys: ['tenant_id'],
|
|
274
|
+
* },
|
|
275
|
+
* contextResolver: (request, baseContext, parsedConfig) => {
|
|
276
|
+
* // Custom logic to build final context
|
|
277
|
+
* return {
|
|
278
|
+
* ...baseContext,
|
|
279
|
+
* ...parsedConfig,
|
|
280
|
+
* resolvedAt: Date.now(),
|
|
281
|
+
* };
|
|
282
|
+
* },
|
|
283
|
+
* };
|
|
284
|
+
* ```
|
|
285
|
+
*/
|
|
286
|
+
export type SessionContextConfig = {
|
|
287
|
+
/**
|
|
288
|
+
* Whether session context extraction is enabled.
|
|
289
|
+
* @default true when SessionContextConfig is provided
|
|
290
|
+
*/
|
|
291
|
+
enabled?: boolean;
|
|
292
|
+
/**
|
|
293
|
+
* Configuration for extracting context from query parameters.
|
|
294
|
+
*/
|
|
295
|
+
queryParam?: {
|
|
296
|
+
/**
|
|
297
|
+
* Name of the query parameter containing the session config.
|
|
298
|
+
* @default 'config'
|
|
299
|
+
*/
|
|
300
|
+
name?: string;
|
|
301
|
+
/**
|
|
302
|
+
* Encoding format of the query parameter value.
|
|
303
|
+
* - 'base64': Value is base64-encoded JSON (recommended for URLs)
|
|
304
|
+
* - 'json': Value is URL-encoded JSON
|
|
305
|
+
* @default 'base64'
|
|
306
|
+
*/
|
|
307
|
+
encoding?: "base64" | "json";
|
|
308
|
+
/**
|
|
309
|
+
* Whitelist of allowed keys from the parsed config.
|
|
310
|
+
* Only these keys will be extracted and merged into context.
|
|
311
|
+
* Strongly recommended for security to prevent injection of arbitrary context values.
|
|
312
|
+
*/
|
|
313
|
+
allowedKeys?: string[];
|
|
314
|
+
};
|
|
315
|
+
/**
|
|
316
|
+
* Optional custom function to resolve the final context.
|
|
317
|
+
* Called after query parameter parsing and key filtering.
|
|
318
|
+
*
|
|
319
|
+
* @param request - The request context (clientId, headers, query)
|
|
320
|
+
* @param baseContext - The base context from server configuration
|
|
321
|
+
* @param parsedQueryConfig - The parsed and filtered query config (if any)
|
|
322
|
+
* @returns The final merged context to pass to module loaders
|
|
323
|
+
*/
|
|
324
|
+
contextResolver?: (request: SessionRequestContext, baseContext: unknown, parsedQueryConfig?: Record<string, unknown>) => unknown;
|
|
325
|
+
/**
|
|
326
|
+
* How to merge session context with base context.
|
|
327
|
+
* - 'shallow': Object.assign style merge (session overrides base)
|
|
328
|
+
* - 'deep': Deep merge of nested objects
|
|
329
|
+
* @default 'shallow'
|
|
330
|
+
*/
|
|
331
|
+
merge?: "shallow" | "deep";
|
|
332
|
+
};
|
|
333
|
+
/**
|
|
334
|
+
* Context information about the incoming request, available to context resolvers.
|
|
335
|
+
*/
|
|
336
|
+
export interface SessionRequestContext {
|
|
337
|
+
/**
|
|
338
|
+
* The client identifier (from mcp-client-id header or auto-generated).
|
|
339
|
+
*/
|
|
340
|
+
clientId: string;
|
|
341
|
+
/**
|
|
342
|
+
* HTTP headers from the request (lowercased keys).
|
|
343
|
+
*/
|
|
344
|
+
headers: Record<string, string>;
|
|
345
|
+
/**
|
|
346
|
+
* Query parameters from the request URL.
|
|
347
|
+
*/
|
|
348
|
+
query: Record<string, string>;
|
|
349
|
+
}
|
|
231
350
|
export type CreatePermissionBasedMcpServerOptions = Omit<CreateMcpServerOptions, "startup"> & {
|
|
232
351
|
/**
|
|
233
352
|
* Permission configuration defining how client access control is enforced.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAI3E,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|