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.
Files changed (31) hide show
  1. package/README.md +182 -29
  2. package/dist/core/DynamicToolManager.d.ts +45 -2
  3. package/dist/core/DynamicToolManager.d.ts.map +1 -1
  4. package/dist/core/ServerOrchestrator.d.ts +24 -2
  5. package/dist/core/ServerOrchestrator.d.ts.map +1 -1
  6. package/dist/http/FastifyTransport.d.ts +17 -0
  7. package/dist/http/FastifyTransport.d.ts.map +1 -1
  8. package/dist/http/customEndpoints.d.ts +247 -0
  9. package/dist/http/customEndpoints.d.ts.map +1 -0
  10. package/dist/http/endpointRegistration.d.ts +35 -0
  11. package/dist/http/endpointRegistration.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +797 -454
  15. package/dist/index.js.map +1 -1
  16. package/dist/meta/registerMetaTools.d.ts +14 -0
  17. package/dist/meta/registerMetaTools.d.ts.map +1 -1
  18. package/dist/mode/ModeResolver.d.ts +7 -0
  19. package/dist/mode/ModeResolver.d.ts.map +1 -1
  20. package/dist/permissions/PermissionAwareFastifyTransport.d.ts +9 -1
  21. package/dist/permissions/PermissionAwareFastifyTransport.d.ts.map +1 -1
  22. package/dist/permissions/PermissionResolver.d.ts +12 -0
  23. package/dist/permissions/PermissionResolver.d.ts.map +1 -1
  24. package/dist/permissions/createPermissionAwareBundle.d.ts +6 -0
  25. package/dist/permissions/createPermissionAwareBundle.d.ts.map +1 -1
  26. package/dist/server/createMcpServer.d.ts +4 -3
  27. package/dist/server/createMcpServer.d.ts.map +1 -1
  28. package/dist/server/createPermissionBasedMcpServer.d.ts.map +1 -1
  29. package/dist/session/ClientResourceCache.d.ts +34 -3
  30. package/dist/session/ClientResourceCache.d.ts.map +1 -1
  31. 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. Note: provide a server or factory:
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
- server: new McpServer({
189
- name: "static-1",
190
- version: "0.0.0",
191
- capabilities: { tools: { listChanged: false } },
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
- server: new McpServer({
200
- name: "static-2",
201
- version: "0.0.0",
202
- capabilities: { tools: { listChanged: false } },
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 unless explicitly set)
801
+ `boolean` (default: true in DYNAMIC mode; false in STATIC mode)
668
802
 
669
- - Whether to register management tools like `enable_toolset`, `disable_toolset`, `list_tools`.
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 override certain policy fields:
945
+ Permission-based servers only support `namespaceToolsWithSetKey`. Other policy fields are ignored because toolset access is controlled by permissions:
809
946
 
810
- - `allowlist`: Set automatically based on resolved permissions (cannot be manually configured)
811
- - `maxActiveToolsets`: Set automatically to match permission count
812
- - `namespaceToolsWithSetKey`: Supported (default: true)
813
- - `denylist`: Not supported (use permissions instead)
814
- - `onLimitExceeded`: Not applicable
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
- Enabled by default when mode is DYNAMIC (or when `registerMetaTools` is true):
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
- - `enable_toolset`, `disable_toolset`, `list_tools`
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 (legacy load-all is not recommended here):
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
- - Starts with meta-tools for runtime management: `enable_toolset`, `disable_toolset`, `list_toolsets`, `describe_toolset`, and `list_tools` (always available)
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
- - Meta-tools limited to `list_tools` by default
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
- enableToolset(toolsetName: string): Promise<{
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
- private registerDirectTools;
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;IAUvC,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;IAIzB,aAAa,CACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA2FpC,cAAc,CACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAoC1C,SAAS;;;;;;;;;IAYH,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;IAgCF,OAAO,CAAC,mBAAmB;IAuBd,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
+ {"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, any>;
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,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAG9E,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpC,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;gBAExC,OAAO,EAAE,yBAAyB;IAoC9C,OAAO,CAAC,oBAAoB;IAqDrB,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;IAI/B,UAAU,IAAI,kBAAkB;CAGxC"}
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;AAEzE,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;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAOtB;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,CAIvB;gBAGH,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;IAeV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8LtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAOnC"}
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"}