toolception 0.3.0 → 0.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/README.md +182 -29
- package/dist/core/DynamicToolManager.d.ts +45 -2
- package/dist/core/DynamicToolManager.d.ts.map +1 -1
- package/dist/core/ServerOrchestrator.d.ts +24 -2
- package/dist/core/ServerOrchestrator.d.ts.map +1 -1
- package/dist/http/FastifyTransport.d.ts +17 -0
- package/dist/http/FastifyTransport.d.ts.map +1 -1
- package/dist/http/customEndpoints.d.ts +247 -0
- package/dist/http/customEndpoints.d.ts.map +1 -0
- package/dist/http/endpointRegistration.d.ts +35 -0
- package/dist/http/endpointRegistration.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +797 -454
- package/dist/index.js.map +1 -1
- package/dist/meta/registerMetaTools.d.ts +14 -0
- package/dist/meta/registerMetaTools.d.ts.map +1 -1
- package/dist/mode/ModeResolver.d.ts +7 -0
- package/dist/mode/ModeResolver.d.ts.map +1 -1
- package/dist/permissions/PermissionAwareFastifyTransport.d.ts +9 -1
- package/dist/permissions/PermissionAwareFastifyTransport.d.ts.map +1 -1
- package/dist/permissions/PermissionResolver.d.ts +12 -0
- package/dist/permissions/PermissionResolver.d.ts.map +1 -1
- package/dist/permissions/createPermissionAwareBundle.d.ts +6 -0
- package/dist/permissions/createPermissionAwareBundle.d.ts.map +1 -1
- package/dist/server/createMcpServer.d.ts +4 -3
- package/dist/server/createMcpServer.d.ts.map +1 -1
- package/dist/server/createPermissionBasedMcpServer.d.ts.map +1 -1
- package/dist/session/ClientResourceCache.d.ts +34 -3
- package/dist/session/ClientResourceCache.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
- [Static startup](#static-startup)
|
|
11
11
|
- [Permission-based starter guide](#permission-based-starter-guide)
|
|
12
12
|
- [Permission configuration approaches](#permission-configuration-approaches)
|
|
13
|
+
- [Custom HTTP endpoints](#custom-http-endpoints)
|
|
13
14
|
- [API](#api)
|
|
14
15
|
- [createMcpServer](#createmcpserveroptions)
|
|
15
16
|
- [createPermissionBasedMcpServer](#createpermissionbasedmcpserveroptions)
|
|
@@ -171,7 +172,7 @@ process.on("SIGTERM", async () => {
|
|
|
171
172
|
|
|
172
173
|
## Static startup
|
|
173
174
|
|
|
174
|
-
Enable some or ALL toolsets at bootstrap.
|
|
175
|
+
Enable some or ALL toolsets at bootstrap. In STATIC mode, a single server instance is created and reused for all clients:
|
|
175
176
|
|
|
176
177
|
```ts
|
|
177
178
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
@@ -181,26 +182,30 @@ const staticCatalog = {
|
|
|
181
182
|
quotes: { name: "Quotes", description: "Market quotes", modules: ["quotes"] },
|
|
182
183
|
};
|
|
183
184
|
|
|
185
|
+
// Load specific toolsets
|
|
184
186
|
createMcpServer({
|
|
185
187
|
catalog: staticCatalog,
|
|
186
188
|
startup: { mode: "STATIC", toolsets: ["search", "quotes"] },
|
|
187
189
|
http: { port: 3001 },
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
190
|
+
createServer: () =>
|
|
191
|
+
new McpServer({
|
|
192
|
+
name: "static-1",
|
|
193
|
+
version: "0.0.0",
|
|
194
|
+
capabilities: { tools: { listChanged: false } },
|
|
195
|
+
}),
|
|
193
196
|
});
|
|
194
197
|
|
|
198
|
+
// Load ALL toolsets
|
|
195
199
|
createMcpServer({
|
|
196
200
|
catalog: staticCatalog,
|
|
197
201
|
startup: { mode: "STATIC", toolsets: "ALL" },
|
|
198
202
|
http: { port: 3002 },
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
203
|
+
createServer: () =>
|
|
204
|
+
new McpServer({
|
|
205
|
+
name: "static-2",
|
|
206
|
+
version: "0.0.0",
|
|
207
|
+
capabilities: { tools: { listChanged: false } },
|
|
208
|
+
}),
|
|
204
209
|
});
|
|
205
210
|
```
|
|
206
211
|
|
|
@@ -585,6 +590,135 @@ await start();
|
|
|
585
590
|
|
|
586
591
|
**Note:** Resolver functions must be synchronous. If you need to fetch permissions from external sources, do so before server creation and cache the results.
|
|
587
592
|
|
|
593
|
+
## Custom HTTP endpoints
|
|
594
|
+
|
|
595
|
+
Toolception supports custom HTTP endpoints alongside MCP protocol endpoints, enabling REST-like APIs with Zod validation and type inference.
|
|
596
|
+
|
|
597
|
+
### Basic usage
|
|
598
|
+
|
|
599
|
+
```ts
|
|
600
|
+
import { createMcpServer, defineEndpoint } from "toolception";
|
|
601
|
+
import { z } from "zod";
|
|
602
|
+
|
|
603
|
+
const { start } = await createMcpServer({
|
|
604
|
+
// ... standard options
|
|
605
|
+
http: {
|
|
606
|
+
port: 3000,
|
|
607
|
+
customEndpoints: [
|
|
608
|
+
defineEndpoint({
|
|
609
|
+
method: "GET",
|
|
610
|
+
path: "/api/users",
|
|
611
|
+
querySchema: z.object({
|
|
612
|
+
limit: z.coerce.number().int().positive().default(10),
|
|
613
|
+
role: z.enum(["admin", "user"]).optional(),
|
|
614
|
+
}),
|
|
615
|
+
responseSchema: z.object({
|
|
616
|
+
users: z.array(z.object({ id: z.string(), name: z.string() })),
|
|
617
|
+
}),
|
|
618
|
+
handler: async (req) => {
|
|
619
|
+
// req.query is typed: { limit: number, role?: "admin" | "user" }
|
|
620
|
+
// req.clientId is available from mcp-client-id header
|
|
621
|
+
return { users: [{ id: "1", name: "Alice" }] };
|
|
622
|
+
},
|
|
623
|
+
}),
|
|
624
|
+
],
|
|
625
|
+
},
|
|
626
|
+
});
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
### Validation schemas
|
|
630
|
+
|
|
631
|
+
- **querySchema**: Validates URL query parameters (use `z.coerce` for type conversion)
|
|
632
|
+
- **bodySchema**: Validates request body (POST/PUT/PATCH)
|
|
633
|
+
- **paramsSchema**: Validates path parameters (e.g., `/users/:userId`)
|
|
634
|
+
- **responseSchema**: Validates handler response (prevents invalid data leakage)
|
|
635
|
+
|
|
636
|
+
### Request context
|
|
637
|
+
|
|
638
|
+
Handlers receive a typed request object:
|
|
639
|
+
|
|
640
|
+
```ts
|
|
641
|
+
{
|
|
642
|
+
body: TBody, // Validated from bodySchema
|
|
643
|
+
query: TQuery, // Validated from querySchema
|
|
644
|
+
params: TParams, // Validated from paramsSchema
|
|
645
|
+
headers: Record<string, string | string[] | undefined>,
|
|
646
|
+
clientId: string, // From mcp-client-id header or auto-generated
|
|
647
|
+
}
|
|
648
|
+
```
|
|
649
|
+
|
|
650
|
+
### Permission-aware endpoints
|
|
651
|
+
|
|
652
|
+
Use `definePermissionAwareEndpoint` in permission-based servers to access client permissions:
|
|
653
|
+
|
|
654
|
+
```ts
|
|
655
|
+
import { createPermissionBasedMcpServer, definePermissionAwareEndpoint } from "toolception";
|
|
656
|
+
|
|
657
|
+
const { start } = await createPermissionBasedMcpServer({
|
|
658
|
+
// ... permission config
|
|
659
|
+
http: {
|
|
660
|
+
customEndpoints: [
|
|
661
|
+
definePermissionAwareEndpoint({
|
|
662
|
+
method: "GET",
|
|
663
|
+
path: "/api/me",
|
|
664
|
+
responseSchema: z.object({
|
|
665
|
+
clientId: z.string(),
|
|
666
|
+
allowedToolsets: z.array(z.string()),
|
|
667
|
+
isAdmin: z.boolean(),
|
|
668
|
+
}),
|
|
669
|
+
handler: async (req) => {
|
|
670
|
+
// req.allowedToolsets and req.failedToolsets are available
|
|
671
|
+
return {
|
|
672
|
+
clientId: req.clientId,
|
|
673
|
+
allowedToolsets: req.allowedToolsets,
|
|
674
|
+
isAdmin: req.allowedToolsets.includes("admin-tools"),
|
|
675
|
+
};
|
|
676
|
+
},
|
|
677
|
+
}),
|
|
678
|
+
],
|
|
679
|
+
},
|
|
680
|
+
});
|
|
681
|
+
```
|
|
682
|
+
|
|
683
|
+
### Error handling
|
|
684
|
+
|
|
685
|
+
Validation failures return standardized error responses:
|
|
686
|
+
|
|
687
|
+
- **400 VALIDATION_ERROR**: Request validation failed (body, query, or params)
|
|
688
|
+
- **500 INTERNAL_ERROR**: Handler threw an exception
|
|
689
|
+
- **500 RESPONSE_VALIDATION_ERROR**: Response validation failed
|
|
690
|
+
|
|
691
|
+
Example error response:
|
|
692
|
+
|
|
693
|
+
```json
|
|
694
|
+
{
|
|
695
|
+
"error": {
|
|
696
|
+
"code": "VALIDATION_ERROR",
|
|
697
|
+
"message": "Validation failed for query",
|
|
698
|
+
"details": [
|
|
699
|
+
{
|
|
700
|
+
"code": "invalid_type",
|
|
701
|
+
"path": ["limit"],
|
|
702
|
+
"message": "Expected number, received string"
|
|
703
|
+
}
|
|
704
|
+
]
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
### Reserved paths
|
|
710
|
+
|
|
711
|
+
Custom endpoints cannot override built-in MCP paths:
|
|
712
|
+
|
|
713
|
+
- `/mcp` - MCP JSON-RPC endpoint
|
|
714
|
+
- `/healthz` - Health check
|
|
715
|
+
- `/tools` - Tool listing
|
|
716
|
+
- `/.well-known/mcp-config` - Configuration schema
|
|
717
|
+
|
|
718
|
+
### Complete example
|
|
719
|
+
|
|
720
|
+
See `examples/custom-endpoints-demo.ts` for a full working example with GET, POST, PUT, DELETE endpoints, pagination, and permission-aware handlers.
|
|
721
|
+
|
|
588
722
|
## API
|
|
589
723
|
|
|
590
724
|
### createMcpServer(options)
|
|
@@ -664,9 +798,11 @@ Startup precedence and validation
|
|
|
664
798
|
|
|
665
799
|
#### options.registerMetaTools (optional)
|
|
666
800
|
|
|
667
|
-
`boolean` (default: true in DYNAMIC mode; false in STATIC
|
|
801
|
+
`boolean` (default: true in DYNAMIC mode; false in STATIC mode)
|
|
668
802
|
|
|
669
|
-
- Whether to register
|
|
803
|
+
- Whether to register meta-tools for toolset management.
|
|
804
|
+
- In DYNAMIC mode: Registers all meta-tools (`enable_toolset`, `disable_toolset`, `list_toolsets`, `describe_toolset`, `list_tools`).
|
|
805
|
+
- In STATIC mode: Only registers `list_tools` (other meta-tools are not applicable since toolsets are fixed at startup).
|
|
670
806
|
|
|
671
807
|
#### options.exposurePolicy (optional)
|
|
672
808
|
|
|
@@ -730,9 +866,10 @@ const moduleLoaders = {
|
|
|
730
866
|
|
|
731
867
|
#### options.http (optional)
|
|
732
868
|
|
|
733
|
-
`{ host?: string; port?: number; basePath?: string; cors?: boolean; logger?: boolean }`
|
|
869
|
+
`{ host?: string; port?: number; basePath?: string; cors?: boolean; logger?: boolean; customEndpoints?: CustomEndpointDefinition[] }`
|
|
734
870
|
|
|
735
871
|
- Fastify transport configuration. Defaults: host `0.0.0.0`, port `3000`, basePath `/`, CORS enabled, logger disabled.
|
|
872
|
+
- `customEndpoints`: Optional array of custom HTTP endpoints to register alongside MCP protocol endpoints. See [Custom HTTP endpoints](#custom-http-endpoints) for details.
|
|
736
873
|
|
|
737
874
|
#### options.createServer (optional)
|
|
738
875
|
|
|
@@ -805,13 +942,17 @@ Same as `createMcpServer` - see [options.moduleLoaders](#optionsmoduleloaders-op
|
|
|
805
942
|
|
|
806
943
|
`ExposurePolicy` (partial support)
|
|
807
944
|
|
|
808
|
-
Permission-based servers
|
|
945
|
+
Permission-based servers only support `namespaceToolsWithSetKey`. Other policy fields are ignored because toolset access is controlled by permissions:
|
|
809
946
|
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
947
|
+
| Field | Support |
|
|
948
|
+
| -------------------------- | ------------------------------------------------- |
|
|
949
|
+
| `namespaceToolsWithSetKey` | ✅ Supported (default: true) |
|
|
950
|
+
| `allowlist` | ⚠️ Ignored (determined by client permissions) |
|
|
951
|
+
| `denylist` | ⚠️ Ignored (use permissions instead) |
|
|
952
|
+
| `maxActiveToolsets` | ⚠️ Ignored (determined by permission count) |
|
|
953
|
+
| `onLimitExceeded` | ⚠️ Ignored (no toolset limits enforced) |
|
|
954
|
+
|
|
955
|
+
**Note:** If you provide ignored options, the server will log warnings at startup to alert you.
|
|
815
956
|
|
|
816
957
|
#### options.http (optional)
|
|
817
958
|
|
|
@@ -831,11 +972,21 @@ Same as `createMcpServer` - see [options.context](#optionscontext-optional).
|
|
|
831
972
|
|
|
832
973
|
### Meta-tools
|
|
833
974
|
|
|
834
|
-
|
|
975
|
+
Meta-tools are registered based on mode:
|
|
976
|
+
|
|
977
|
+
**DYNAMIC mode** (registered by default, or when `registerMetaTools` is true):
|
|
978
|
+
|
|
979
|
+
- `enable_toolset` - Enable a toolset by name
|
|
980
|
+
- `disable_toolset` - Disable a toolset by name (state only; tools remain registered)
|
|
981
|
+
- `list_toolsets` - List available toolsets with active status
|
|
982
|
+
- `describe_toolset` - Describe a specific toolset with definition and tools
|
|
983
|
+
- `list_tools` - List currently registered tool names
|
|
984
|
+
|
|
985
|
+
**STATIC mode** (when `registerMetaTools` is true):
|
|
986
|
+
|
|
987
|
+
- `list_tools` - List currently registered tool names
|
|
835
988
|
|
|
836
|
-
|
|
837
|
-
Only in DYNAMIC mode:
|
|
838
|
-
- `list_toolsets`, `describe_toolset`
|
|
989
|
+
Note: In STATIC mode, `enable_toolset`, `disable_toolset`, `list_toolsets`, and `describe_toolset` are not available since toolsets are fixed at startup.
|
|
839
990
|
|
|
840
991
|
## Permission-based client integration
|
|
841
992
|
|
|
@@ -1344,17 +1495,19 @@ Note on dynamic mode: Both direct and module-produced tools are supported. Modul
|
|
|
1344
1495
|
|
|
1345
1496
|
## Startup modes
|
|
1346
1497
|
|
|
1347
|
-
The server operates in one of two primary modes
|
|
1498
|
+
The server operates in one of two primary modes:
|
|
1348
1499
|
|
|
1349
|
-
1. Dynamic mode (startup.mode = "DYNAMIC")
|
|
1500
|
+
1. **Dynamic mode** (`startup.mode = "DYNAMIC"`)
|
|
1350
1501
|
|
|
1351
|
-
-
|
|
1502
|
+
- All meta-tools registered: `enable_toolset`, `disable_toolset`, `list_toolsets`, `describe_toolset`, `list_tools`
|
|
1352
1503
|
- Tools are loaded on-demand via meta-tool calls
|
|
1504
|
+
- Each client gets an isolated server instance
|
|
1353
1505
|
- Best for flexible, task-specific workflows where tool needs change
|
|
1354
1506
|
|
|
1355
|
-
2. Static mode (startup.mode = "STATIC")
|
|
1507
|
+
2. **Static mode** (`startup.mode = "STATIC"`)
|
|
1356
1508
|
- Pre-loads specific toolsets at startup (`toolsets` array or "ALL")
|
|
1357
|
-
-
|
|
1509
|
+
- Only `list_tools` meta-tool is available (toolsets cannot be changed at runtime)
|
|
1510
|
+
- A single server instance is reused for all clients
|
|
1358
1511
|
- Best for known, consistent tool requirements
|
|
1359
1512
|
|
|
1360
1513
|
## License
|
|
@@ -19,14 +19,48 @@ export declare class DynamicToolManager {
|
|
|
19
19
|
private readonly toolRegistry;
|
|
20
20
|
private readonly activeToolsets;
|
|
21
21
|
constructor(options: DynamicToolManagerOptions);
|
|
22
|
+
/**
|
|
23
|
+
* Sends a tool list change notification if configured.
|
|
24
|
+
* Logs warnings on failure instead of throwing.
|
|
25
|
+
* @returns Promise that resolves when notification is sent (or skipped)
|
|
26
|
+
* @private
|
|
27
|
+
*/
|
|
28
|
+
private notifyToolsChanged;
|
|
22
29
|
getAvailableToolsets(): string[];
|
|
23
30
|
getActiveToolsets(): string[];
|
|
24
31
|
getToolsetDefinition(name: string): ToolSetDefinition | undefined;
|
|
25
32
|
isActive(name: string): boolean;
|
|
26
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Enables a single toolset by name.
|
|
35
|
+
* Validates the toolset, checks exposure policies, resolves tools, and registers them.
|
|
36
|
+
* @param toolsetName - The name of the toolset to enable
|
|
37
|
+
* @param skipNotification - If true, skips the tool list change notification (for batch operations)
|
|
38
|
+
* @returns Result object with success status and message
|
|
39
|
+
*/
|
|
40
|
+
enableToolset(toolsetName: string, skipNotification?: boolean): Promise<{
|
|
27
41
|
success: boolean;
|
|
28
42
|
message: string;
|
|
29
43
|
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Checks if a toolset is allowed by the exposure policy.
|
|
46
|
+
* @param toolsetName - The sanitized toolset name to check
|
|
47
|
+
* @returns Object indicating if allowed and reason message if not
|
|
48
|
+
* @private
|
|
49
|
+
*/
|
|
50
|
+
private checkExposurePolicy;
|
|
51
|
+
/**
|
|
52
|
+
* Registers a single tool with the MCP server.
|
|
53
|
+
* @param tool - The tool definition to register
|
|
54
|
+
* @param toolsetKey - The toolset key for tracking
|
|
55
|
+
* @private
|
|
56
|
+
*/
|
|
57
|
+
private registerSingleTool;
|
|
58
|
+
/**
|
|
59
|
+
* Disables a toolset by name.
|
|
60
|
+
* Note: Due to MCP limitations, tools remain registered but the toolset is marked inactive.
|
|
61
|
+
* @param toolsetName - The name of the toolset to disable
|
|
62
|
+
* @returns Result object with success status and message
|
|
63
|
+
*/
|
|
30
64
|
disableToolset(toolsetName: string): Promise<{
|
|
31
65
|
success: boolean;
|
|
32
66
|
message: string;
|
|
@@ -40,6 +74,12 @@ export declare class DynamicToolManager {
|
|
|
40
74
|
tools: string[];
|
|
41
75
|
toolsetToTools: Record<string, string[]>;
|
|
42
76
|
};
|
|
77
|
+
/**
|
|
78
|
+
* Enables multiple toolsets in a batch operation.
|
|
79
|
+
* Sends a single notification after all toolsets are processed.
|
|
80
|
+
* @param toolsetNames - Array of toolset names to enable
|
|
81
|
+
* @returns Result object with overall success status and individual results
|
|
82
|
+
*/
|
|
43
83
|
enableToolsets(toolsetNames: string[]): Promise<{
|
|
44
84
|
success: boolean;
|
|
45
85
|
results: Array<{
|
|
@@ -50,7 +90,10 @@ export declare class DynamicToolManager {
|
|
|
50
90
|
}>;
|
|
51
91
|
message: string;
|
|
52
92
|
}>;
|
|
53
|
-
|
|
93
|
+
/**
|
|
94
|
+
* Enables all available toolsets in a batch operation.
|
|
95
|
+
* @returns Result object with overall success status and individual results
|
|
96
|
+
*/
|
|
54
97
|
enableAllToolsets(): Promise<{
|
|
55
98
|
success: boolean;
|
|
56
99
|
results: Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicToolManager.d.ts","sourceRoot":"","sources":["../../src/core/DynamicToolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,cAAc,EAEd,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAExC,OAAO,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"DynamicToolManager.d.ts","sourceRoot":"","sources":["../../src/core/DynamicToolManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,cAAc,EAEd,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAA6B;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAExC,OAAO,EAAE,yBAAyB;IAU9C;;;;;OAKG;YACW,kBAAkB;IASzB,oBAAoB,IAAI,MAAM,EAAE;IAIhC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIjE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;OAMG;IACU,aAAa,CACxB,WAAW,EAAE,MAAM,EACnB,gBAAgB,UAAQ,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA4EjD;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;;;OAKG;IACU,cAAc,CACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAgC1C,SAAS;;;;;;;;;IAYhB;;;;;OAKG;IACU,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC3D,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,CAAC,EAAE,gBAAgB,CAAC;SACzB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAuCF;;;OAGG;IACU,iBAAiB,IAAI,OAAO,CAAC;QACxC,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,IAAI,CAAC,EAAE,gBAAgB,CAAC;SACzB,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CAIH"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { DynamicToolManager } from './DynamicToolManager.js';
|
|
3
|
-
import { ExposurePolicy, Mode, ToolSetCatalog } from '../types/index.js';
|
|
3
|
+
import { ExposurePolicy, Mode, ModuleLoader, ToolSetCatalog } from '../types/index.js';
|
|
4
4
|
export interface ServerOrchestratorOptions {
|
|
5
5
|
server: McpServer;
|
|
6
6
|
catalog: ToolSetCatalog;
|
|
7
|
-
moduleLoaders?: Record<string,
|
|
7
|
+
moduleLoaders?: Record<string, ModuleLoader>;
|
|
8
8
|
exposurePolicy?: ExposurePolicy;
|
|
9
9
|
context?: unknown;
|
|
10
10
|
notifyToolsListChanged?: () => Promise<void> | void;
|
|
@@ -19,7 +19,29 @@ export declare class ServerOrchestrator {
|
|
|
19
19
|
private readonly resolver;
|
|
20
20
|
private readonly manager;
|
|
21
21
|
private readonly toolsetValidator;
|
|
22
|
+
private readonly initPromise;
|
|
23
|
+
private initError;
|
|
22
24
|
constructor(options: ServerOrchestratorOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Initializes toolsets asynchronously during construction.
|
|
27
|
+
* Stores any errors for later retrieval via ensureReady().
|
|
28
|
+
* @param initial - The toolsets to initialize or "ALL"
|
|
29
|
+
* @returns Promise that resolves when initialization is complete
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
private initializeToolsets;
|
|
33
|
+
/**
|
|
34
|
+
* Waits for the orchestrator to be fully initialized.
|
|
35
|
+
* Call this before using the orchestrator to ensure all toolsets are loaded.
|
|
36
|
+
* @throws {Error} If initialization failed
|
|
37
|
+
*/
|
|
38
|
+
ensureReady(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if the orchestrator has finished initialization.
|
|
41
|
+
* Does not throw on error - use ensureReady() for that.
|
|
42
|
+
* @returns Promise that resolves to true if ready, false if initialization failed
|
|
43
|
+
*/
|
|
44
|
+
isReady(): Promise<boolean>;
|
|
23
45
|
private resolveStartupConfig;
|
|
24
46
|
getMode(): Exclude<Mode, "ALL">;
|
|
25
47
|
getManager(): DynamicToolManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerOrchestrator.d.ts","sourceRoot":"","sources":["../../src/core/ServerOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ServerOrchestrator.d.ts","sourceRoot":"","sources":["../../src/core/ServerOrchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EACV,cAAc,EACd,IAAI,EACJ,YAAY,EACZ,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,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,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpD,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;CAC7B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,SAAS,CAAsB;gBAE3B,OAAO,EAAE,yBAAyB;IAgC9C;;;;;;OAMG;YACW,kBAAkB;IAgBhC;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAOzC;;;;OAIG;IACU,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAKxC,OAAO,CAAC,oBAAoB;IAqDrB,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;IAI/B,UAAU,IAAI,kBAAkB;CAGxC"}
|
|
@@ -2,6 +2,7 @@ import { FastifyInstance } from 'fastify';
|
|
|
2
2
|
import { DynamicToolManager } from '../core/DynamicToolManager.js';
|
|
3
3
|
import { ServerOrchestrator } from '../core/ServerOrchestrator.js';
|
|
4
4
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
import { CustomEndpointDefinition } from './customEndpoints.js';
|
|
5
6
|
export interface FastifyTransportOptions {
|
|
6
7
|
host?: string;
|
|
7
8
|
port?: number;
|
|
@@ -9,6 +10,11 @@ export interface FastifyTransportOptions {
|
|
|
9
10
|
cors?: boolean;
|
|
10
11
|
logger?: boolean;
|
|
11
12
|
app?: FastifyInstance;
|
|
13
|
+
/**
|
|
14
|
+
* Optional custom HTTP endpoints to register alongside MCP protocol endpoints.
|
|
15
|
+
* Allows adding REST-like endpoints with Zod validation and type inference.
|
|
16
|
+
*/
|
|
17
|
+
customEndpoints?: CustomEndpointDefinition[];
|
|
12
18
|
}
|
|
13
19
|
export declare class FastifyTransport {
|
|
14
20
|
private readonly options;
|
|
@@ -22,6 +28,17 @@ export declare class FastifyTransport {
|
|
|
22
28
|
orchestrator: ServerOrchestrator;
|
|
23
29
|
}, options?: FastifyTransportOptions, configSchema?: object);
|
|
24
30
|
start(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Stops the Fastify server and cleans up all resources.
|
|
33
|
+
* Closes all client sessions and clears the cache.
|
|
34
|
+
*/
|
|
25
35
|
stop(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Cleans up resources associated with a client bundle.
|
|
38
|
+
* Closes all sessions within the bundle.
|
|
39
|
+
* @param bundle - The client bundle to clean up
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
private cleanupBundle;
|
|
26
43
|
}
|
|
27
44
|
//# sourceMappingURL=FastifyTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FastifyTransport.d.ts","sourceRoot":"","sources":["../../src/http/FastifyTransport.ts"],"names":[],"mappings":"AAAA,OAAgB,EACd,KAAK,eAAe,EAGrB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"FastifyTransport.d.ts","sourceRoot":"","sources":["../../src/http/FastifyTransport.ts"],"names":[],"mappings":"AAAA,OAAgB,EACd,KAAK,eAAe,EAGrB,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAIxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGrE,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,wBAAwB,EAAE,CAAC;CAC9C;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAQtB;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAG3B;IACF,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAS;IAGvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CASzB;gBAGD,cAAc,EAAE,kBAAkB,EAClC,YAAY,EAAE,MAAM;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,YAAY,EAAE,kBAAkB,CAAA;KAAE,EAC3E,OAAO,GAAE,uBAA4B,EACrC,YAAY,CAAC,EAAE,MAAM;IAgBV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoMnC;;;OAGG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC;;;;;OAKG;IACH,OAAO,CAAC,aAAa;CAkBtB"}
|