@nestjs-mcp/server 0.1.1 → 0.2.0-alpha.1
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 +66 -0
- package/dist/controllers/sse/sse.controller.d.ts +3 -1
- package/dist/controllers/sse/sse.controller.js +8 -2
- package/dist/controllers/sse/sse.controller.js.map +1 -1
- package/dist/controllers/sse/sse.service.d.ts +3 -2
- package/dist/controllers/sse/sse.service.js +21 -6
- package/dist/controllers/sse/sse.service.js.map +1 -1
- package/dist/controllers/streamable/streamable.service.d.ts +6 -11
- package/dist/controllers/streamable/streamable.service.js +36 -11
- package/dist/controllers/streamable/streamable.service.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interfaces/capabilities.interface.d.ts +32 -2
- package/dist/interfaces/capabilities.interface.js +51 -0
- package/dist/interfaces/capabilities.interface.js.map +1 -1
- package/dist/interfaces/context.interface.d.ts +6 -0
- package/dist/interfaces/context.interface.js +3 -0
- package/dist/interfaces/context.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +2 -1
- package/dist/interfaces/index.js +2 -1
- package/dist/interfaces/index.js.map +1 -1
- package/dist/interfaces/mcp-server-options.interface.d.ts +2 -2
- package/dist/interfaces/message.types.d.ts +8 -0
- package/dist/interfaces/{guards.interface.js → message.types.js} +1 -1
- package/dist/interfaces/message.types.js.map +1 -0
- package/dist/mcp.module.js +13 -1
- package/dist/mcp.module.js.map +1 -1
- package/dist/registry/registry.service.d.ts +7 -1
- package/dist/registry/registry.service.js +72 -6
- package/dist/registry/registry.service.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/session.manager.d.ts +14 -0
- package/dist/services/session.manager.js +27 -0
- package/dist/services/session.manager.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +23 -16
- package/.copilotignore +0 -38
- package/.devcontainer/Dockerfile.dev +0 -28
- package/.devcontainer/devcontainer.json +0 -56
- package/.devcontainer/docker-compose.yml +0 -15
- package/.dockerignore +0 -37
- package/.prettierrc +0 -4
- package/coverage/clover.xml +0 -507
- package/coverage/coverage-final.json +0 -19
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -206
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov-report/src/controllers/sse/index.html +0 -146
- package/coverage/lcov-report/src/controllers/sse/index.ts.html +0 -91
- package/coverage/lcov-report/src/controllers/sse/sse.controller.ts.html +0 -160
- package/coverage/lcov-report/src/controllers/sse/sse.service.ts.html +0 -403
- package/coverage/lcov-report/src/controllers/streamable/index.html +0 -146
- package/coverage/lcov-report/src/controllers/streamable/index.ts.html +0 -91
- package/coverage/lcov-report/src/controllers/streamable/streamable.controller.ts.html +0 -157
- package/coverage/lcov-report/src/controllers/streamable/streamable.service.ts.html +0 -655
- package/coverage/lcov-report/src/decorators/capabilities.constants.ts.html +0 -106
- package/coverage/lcov-report/src/decorators/capabilities.decorators.ts.html +0 -535
- package/coverage/lcov-report/src/decorators/index.html +0 -146
- package/coverage/lcov-report/src/decorators/index.ts.html +0 -91
- package/coverage/lcov-report/src/index.html +0 -131
- package/coverage/lcov-report/src/index.ts.html +0 -118
- package/coverage/lcov-report/src/interfaces/capabilities.interface.ts.html +0 -703
- package/coverage/lcov-report/src/interfaces/index.html +0 -131
- package/coverage/lcov-report/src/interfaces/index.ts.html +0 -91
- package/coverage/lcov-report/src/mcp.module.ts.html +0 -817
- package/coverage/lcov-report/src/registry/discovery.service.ts.html +0 -433
- package/coverage/lcov-report/src/registry/index.html +0 -161
- package/coverage/lcov-report/src/registry/index.ts.html +0 -91
- package/coverage/lcov-report/src/registry/logger.service.ts.html +0 -514
- package/coverage/lcov-report/src/registry/registry.service.ts.html +0 -1183
- package/coverage/lcov-report/src/services/index.html +0 -116
- package/coverage/lcov-report/src/services/session.manager.ts.html +0 -163
- package/coverage/lcov.info +0 -912
- package/dist/interfaces/guards.interface.d.ts +0 -4
- package/dist/interfaces/guards.interface.js.map +0 -1
- package/eslint.config.mjs +0 -40
- package/src/controllers/sse/index.ts +0 -2
- package/src/controllers/sse/sse.controller.ts +0 -25
- package/src/controllers/sse/sse.service.ts +0 -106
- package/src/controllers/streamable/index.ts +0 -2
- package/src/controllers/streamable/streamable.controller.ts +0 -24
- package/src/controllers/streamable/streamable.service.ts +0 -190
- package/src/decorators/capabilities.constants.ts +0 -7
- package/src/decorators/capabilities.decorators.ts +0 -150
- package/src/decorators/index.ts +0 -2
- package/src/index.ts +0 -11
- package/src/interfaces/capabilities.interface.ts +0 -206
- package/src/interfaces/context.interface.ts +0 -33
- package/src/interfaces/index.ts +0 -2
- package/src/interfaces/mcp-server-options.interface.ts +0 -105
- package/src/interfaces/message.types.ts +0 -13
- package/src/mcp.module.ts +0 -244
- package/src/mcp.service.spec.ts +0 -28
- package/src/registry/discovery.service.ts +0 -116
- package/src/registry/index.ts +0 -2
- package/src/registry/logger.service.ts +0 -143
- package/src/registry/registry.service.ts +0 -366
- package/src/services/session.manager.ts +0 -26
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
[](https://snyk.io/test/github/adrian-d-hidalgo/nestjs-mcp-server)
|
|
9
9
|
[](./LICENSE)
|
|
10
10
|
[](./CONTRIBUTING.md)
|
|
11
|
+
[](CODE_OF_CONDUCT.md)
|
|
11
12
|
|
|
12
13
|
---
|
|
13
14
|
|
|
@@ -40,6 +41,7 @@
|
|
|
40
41
|
- [Prompt Decorator](#prompt-decorator)
|
|
41
42
|
- [Resource Decorator](#resource-decorator)
|
|
42
43
|
- [Tool Decorator](#tool-decorator)
|
|
44
|
+
- [RequestHandlerExtra Parameter](#requesthandlerextra-argument)
|
|
43
45
|
- [Guards](#guards)
|
|
44
46
|
- [Global-level guards](#global-level-guards)
|
|
45
47
|
- [Resolver-level guards](#resolver-level-guards)
|
|
@@ -496,6 +498,68 @@ export class MyTools {
|
|
|
496
498
|
}
|
|
497
499
|
```
|
|
498
500
|
|
|
501
|
+
### RequestHandlerExtra Argument
|
|
502
|
+
|
|
503
|
+
All MCP capability methods (`@Prompt`, `@Resource`, `@Tool`) always receive a `RequestHandlerExtra` object as their last parameter. This object extends the original type from `@modelcontextprotocol/sdk` and provides essential context about the current MCP request.
|
|
504
|
+
|
|
505
|
+
**Properties from SDK:**
|
|
506
|
+
|
|
507
|
+
- `signal`: An `AbortSignal` used to communicate if the request was cancelled
|
|
508
|
+
- `authInfo`: Optional information about a validated access token
|
|
509
|
+
- `sessionId`: The session ID from the transport, if available
|
|
510
|
+
- `sendNotification`: Function to send a notification related to the current request
|
|
511
|
+
- `sendRequest`: Function to send a request related to the current request
|
|
512
|
+
|
|
513
|
+
**Extended Properties:**
|
|
514
|
+
|
|
515
|
+
- `headers`: HTTP headers from the original request (added by @nestjs-mcp/server)
|
|
516
|
+
|
|
517
|
+
**Usage Example:**
|
|
518
|
+
|
|
519
|
+
```ts
|
|
520
|
+
import { Tool, Resolver, SessionManager } from '@nestjs-mcp/server';
|
|
521
|
+
import { RequestHandlerExtra } from '@nestjs-mcp/server';
|
|
522
|
+
import { CallToolResult } from '@modelcontextprotocol/sdk/types';
|
|
523
|
+
|
|
524
|
+
@Resolver('auth')
|
|
525
|
+
export class AuthResolver {
|
|
526
|
+
@Tool({
|
|
527
|
+
name: 'authenticate_user',
|
|
528
|
+
description: 'Authenticates a user with credentials',
|
|
529
|
+
// ...other options
|
|
530
|
+
})
|
|
531
|
+
authenticateUser(
|
|
532
|
+
params: { username: string; password: string },
|
|
533
|
+
extra: RequestHandlerExtra, // Always the last parameter
|
|
534
|
+
): CallToolResult {
|
|
535
|
+
// Access the session ID
|
|
536
|
+
console.log(`Request received in session: ${extra.sessionId}`);
|
|
537
|
+
|
|
538
|
+
// Access request headers (extended property)
|
|
539
|
+
const authHeader = extra.headers.authorization;
|
|
540
|
+
const userAgent = extra.headers['user-agent'];
|
|
541
|
+
console.log(`Request from: ${userAgent}`);
|
|
542
|
+
|
|
543
|
+
// Check if request was cancelled
|
|
544
|
+
if (extra.signal.aborted) {
|
|
545
|
+
return {
|
|
546
|
+
content: [{ type: 'text', text: 'Request was cancelled' }],
|
|
547
|
+
};
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Implement authentication logic
|
|
551
|
+
return {
|
|
552
|
+
content: [{ type: 'text', text: 'Authentication successful' }],
|
|
553
|
+
};
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**Important Notes:**
|
|
559
|
+
|
|
560
|
+
- `extra` is always the last parameter in any method decorated with `@Resource`, `@Prompt`, or `@Tool`
|
|
561
|
+
- The `headers` property is an extension added by @nestjs-mcp/server to access HTTP headers directly
|
|
562
|
+
|
|
499
563
|
---
|
|
500
564
|
|
|
501
565
|
## Guards
|
|
@@ -856,3 +920,5 @@ MIT — see [LICENSE](./LICENSE) for details.
|
|
|
856
920
|
## Contributions
|
|
857
921
|
|
|
858
922
|
Contributions are welcome! Please see [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines, reporting issues, and pull request rules.
|
|
923
|
+
|
|
924
|
+
Before contributing, please read our [Code of Conduct](./CODE_OF_CONDUCT.md) to understand the expectations for behavior in our community.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { Request, Response } from 'express';
|
|
2
|
+
import { McpLoggerService } from '../../registry/logger.service';
|
|
2
3
|
import { SseService } from './sse.service';
|
|
3
4
|
export declare class SseController {
|
|
5
|
+
private readonly logger;
|
|
4
6
|
private readonly service;
|
|
5
|
-
constructor(service: SseService);
|
|
7
|
+
constructor(logger: McpLoggerService, service: SseService);
|
|
6
8
|
handleSse(req: Request, res: Response): Promise<void>;
|
|
7
9
|
handleMessages(req: Request, res: Response): Promise<void>;
|
|
8
10
|
}
|
|
@@ -14,16 +14,21 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.SseController = void 0;
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
|
+
const logger_service_1 = require("../../registry/logger.service");
|
|
17
18
|
const sse_service_1 = require("./sse.service");
|
|
18
19
|
let SseController = class SseController {
|
|
20
|
+
logger;
|
|
19
21
|
service;
|
|
20
|
-
constructor(service) {
|
|
22
|
+
constructor(logger, service) {
|
|
23
|
+
this.logger = logger;
|
|
21
24
|
this.service = service;
|
|
22
25
|
}
|
|
23
26
|
async handleSse(req, res) {
|
|
27
|
+
this.logger.log('[SSE] Connection established');
|
|
24
28
|
await this.service.handleSse(req, res);
|
|
25
29
|
}
|
|
26
30
|
async handleMessages(req, res) {
|
|
31
|
+
this.logger.log('[SSE] Message received');
|
|
27
32
|
await this.service.handleMessage(req, res);
|
|
28
33
|
}
|
|
29
34
|
};
|
|
@@ -46,6 +51,7 @@ __decorate([
|
|
|
46
51
|
], SseController.prototype, "handleMessages", null);
|
|
47
52
|
exports.SseController = SseController = __decorate([
|
|
48
53
|
(0, common_1.Controller)(),
|
|
49
|
-
__metadata("design:paramtypes", [
|
|
54
|
+
__metadata("design:paramtypes", [logger_service_1.McpLoggerService,
|
|
55
|
+
sse_service_1.SseService])
|
|
50
56
|
], SseController);
|
|
51
57
|
//# sourceMappingURL=sse.controller.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.controller.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAiE;AAGjE,+CAA2C;AAGpC,IAAM,aAAa,GAAnB,MAAM,aAAa;
|
|
1
|
+
{"version":3,"file":"sse.controller.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAiE;AAGjE,kEAAiE;AACjE,+CAA2C;AAGpC,IAAM,aAAa,GAAnB,MAAM,aAAa;IAEL;IACA;IAFnB,YACmB,MAAwB,EACxB,OAAmB;QADnB,WAAM,GAAN,MAAM,CAAkB;QACxB,YAAO,GAAP,OAAO,CAAY;IACnC,CAAC;IAGE,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY,EAAS,GAAa;QACvD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAChD,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IAGK,AAAN,KAAK,CAAC,cAAc,CAAQ,GAAY,EAAS,GAAa;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;CACF,CAAA;AAjBY,sCAAa;AAOlB;IADL,IAAA,YAAG,EAAC,KAAK,CAAC;IACM,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;8CAG1C;AAGK;IADL,IAAA,aAAI,EAAC,UAAU,CAAC;IACK,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mDAG/C;wBAhBU,aAAa;IADzB,IAAA,mBAAU,GAAE;qCAGgB,iCAAgB;QACf,wBAAU;GAH3B,aAAa,CAiBzB"}
|
|
@@ -3,13 +3,14 @@ import { Request, Response } from 'express';
|
|
|
3
3
|
import { McpServerOptions } from '../../interfaces/mcp-server-options.interface';
|
|
4
4
|
import { McpLoggerService } from '../../registry/logger.service';
|
|
5
5
|
import { RegistryService } from '../../registry/registry.service';
|
|
6
|
+
import { SessionManager } from '../../services/session.manager';
|
|
6
7
|
export declare class SseService implements OnModuleInit {
|
|
7
8
|
private readonly options;
|
|
8
9
|
private readonly registry;
|
|
9
10
|
private readonly logger;
|
|
11
|
+
private readonly sessionManager;
|
|
10
12
|
private server;
|
|
11
|
-
|
|
12
|
-
constructor(options: McpServerOptions, registry: RegistryService, logger: McpLoggerService);
|
|
13
|
+
constructor(options: McpServerOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
|
|
13
14
|
onModuleInit(): Promise<void>;
|
|
14
15
|
handleSse(req: Request, res: Response): Promise<void>;
|
|
15
16
|
handleMessage(req: Request, res: Response): Promise<void>;
|
|
@@ -18,16 +18,18 @@ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
|
|
|
18
18
|
const common_1 = require("@nestjs/common");
|
|
19
19
|
const logger_service_1 = require("../../registry/logger.service");
|
|
20
20
|
const registry_service_1 = require("../../registry/registry.service");
|
|
21
|
+
const session_manager_1 = require("../../services/session.manager");
|
|
21
22
|
let SseService = class SseService {
|
|
22
23
|
options;
|
|
23
24
|
registry;
|
|
24
25
|
logger;
|
|
26
|
+
sessionManager;
|
|
25
27
|
server;
|
|
26
|
-
|
|
27
|
-
constructor(options, registry, logger) {
|
|
28
|
+
constructor(options, registry, logger, sessionManager) {
|
|
28
29
|
this.options = options;
|
|
29
30
|
this.registry = registry;
|
|
30
31
|
this.logger = logger;
|
|
32
|
+
this.sessionManager = sessionManager;
|
|
31
33
|
this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
|
|
32
34
|
}
|
|
33
35
|
async onModuleInit() {
|
|
@@ -37,18 +39,30 @@ let SseService = class SseService {
|
|
|
37
39
|
}
|
|
38
40
|
async handleSse(req, res) {
|
|
39
41
|
const transport = new sse_js_1.SSEServerTransport('/messages', res);
|
|
40
|
-
this.
|
|
42
|
+
this.sessionManager.setSession(transport.sessionId, {
|
|
43
|
+
transport,
|
|
44
|
+
request: req,
|
|
45
|
+
});
|
|
41
46
|
this.logger.debug(`Starting SSE for sessionId: ${transport.sessionId}`, 'api');
|
|
42
47
|
res.on('close', () => {
|
|
43
|
-
|
|
48
|
+
this.sessionManager.deleteSession(transport.sessionId);
|
|
44
49
|
});
|
|
45
50
|
await this.server.connect(transport);
|
|
46
51
|
}
|
|
47
52
|
async handleMessage(req, res) {
|
|
48
53
|
const sessionId = req.query.sessionId;
|
|
49
|
-
const
|
|
54
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
55
|
+
if (!session) {
|
|
56
|
+
res.status(400).send('Invalid or missing sessionId');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
50
59
|
this.logger.debug(`Receiving SSE message for sessionId: ${sessionId}`, 'api');
|
|
51
60
|
this.logger.debug(`SSE message: ${JSON.stringify(req.body)}`, 'MCP_SERVER');
|
|
61
|
+
const transport = session.transport;
|
|
62
|
+
if (!(transport instanceof sse_js_1.SSEServerTransport)) {
|
|
63
|
+
res.status(400).send('Invalid transport');
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
52
66
|
try {
|
|
53
67
|
if (transport) {
|
|
54
68
|
await transport.handlePostMessage(req, res, req.body);
|
|
@@ -73,6 +87,7 @@ exports.SseService = SseService = __decorate([
|
|
|
73
87
|
(0, common_1.Injectable)(),
|
|
74
88
|
__param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
|
|
75
89
|
__metadata("design:paramtypes", [Object, registry_service_1.RegistryService,
|
|
76
|
-
logger_service_1.McpLoggerService
|
|
90
|
+
logger_service_1.McpLoggerService,
|
|
91
|
+
session_manager_1.SessionManager])
|
|
77
92
|
], SseService);
|
|
78
93
|
//# sourceMappingURL=sse.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAAoE;AACpE,oEAA6E;AAC7E,2CAAkE;AAIlE,kEAAiE;AACjE,sEAAkE;
|
|
1
|
+
{"version":3,"file":"sse.service.js","sourceRoot":"","sources":["../../../src/controllers/sse/sse.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,22 +3,17 @@ import { Request, Response } from 'express';
|
|
|
3
3
|
import { McpModuleTransportOptions, McpServerOptions } from '../../interfaces/mcp-server-options.interface';
|
|
4
4
|
import { McpLoggerService } from '../../registry/logger.service';
|
|
5
5
|
import { RegistryService } from '../../registry/registry.service';
|
|
6
|
+
import { SessionManager } from '../../services/session.manager';
|
|
6
7
|
export declare class StreamableService implements OnModuleInit {
|
|
7
8
|
private readonly options;
|
|
8
9
|
private readonly transportOptions;
|
|
9
10
|
private readonly registry;
|
|
10
11
|
private readonly logger;
|
|
12
|
+
private readonly sessionManager;
|
|
11
13
|
private server;
|
|
12
|
-
|
|
13
|
-
constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService);
|
|
14
|
+
constructor(options: McpServerOptions, transportOptions: McpModuleTransportOptions, registry: RegistryService, logger: McpLoggerService, sessionManager: SessionManager);
|
|
14
15
|
onModuleInit(): Promise<void>;
|
|
15
|
-
handlePostRequest(req: Request
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
handleGetRequest(req: Request<any, any, any, {
|
|
19
|
-
sessionId?: string;
|
|
20
|
-
}>, res: Response): Promise<void>;
|
|
21
|
-
handleDeleteRequest(req: Request<any, any, any, {
|
|
22
|
-
sessionId?: string;
|
|
23
|
-
}>, res: Response): Promise<void>;
|
|
16
|
+
handlePostRequest(req: Request, res: Response): Promise<void>;
|
|
17
|
+
handleGetRequest(req: Request, res: Response): Promise<void>;
|
|
18
|
+
handleDeleteRequest(req: Request, res: Response): Promise<void>;
|
|
24
19
|
}
|
|
@@ -20,18 +20,20 @@ const common_1 = require("@nestjs/common");
|
|
|
20
20
|
const crypto_1 = require("crypto");
|
|
21
21
|
const logger_service_1 = require("../../registry/logger.service");
|
|
22
22
|
const registry_service_1 = require("../../registry/registry.service");
|
|
23
|
+
const session_manager_1 = require("../../services/session.manager");
|
|
23
24
|
let StreamableService = class StreamableService {
|
|
24
25
|
options;
|
|
25
26
|
transportOptions;
|
|
26
27
|
registry;
|
|
27
28
|
logger;
|
|
29
|
+
sessionManager;
|
|
28
30
|
server;
|
|
29
|
-
|
|
30
|
-
constructor(options, transportOptions, registry, logger) {
|
|
31
|
+
constructor(options, transportOptions, registry, logger, sessionManager) {
|
|
31
32
|
this.options = options;
|
|
32
33
|
this.transportOptions = transportOptions;
|
|
33
34
|
this.registry = registry;
|
|
34
35
|
this.logger = logger;
|
|
36
|
+
this.sessionManager = sessionManager;
|
|
35
37
|
this.server = new mcp_js_1.McpServer(this.options.serverInfo, this.options.options);
|
|
36
38
|
}
|
|
37
39
|
async onModuleInit() {
|
|
@@ -42,23 +44,34 @@ let StreamableService = class StreamableService {
|
|
|
42
44
|
const sessionId = req.headers['mcp-session-id'];
|
|
43
45
|
let transport;
|
|
44
46
|
const { options } = this.transportOptions?.streamable || {};
|
|
45
|
-
if (sessionId && this.
|
|
46
|
-
|
|
47
|
+
if (sessionId && this.sessionManager.getSession(sessionId)) {
|
|
48
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
49
|
+
if (!session) {
|
|
50
|
+
throw new Error('Session not found');
|
|
51
|
+
}
|
|
52
|
+
if (!(session.transport instanceof streamableHttp_js_1.StreamableHTTPServerTransport)) {
|
|
53
|
+
throw new Error('Invalid transport');
|
|
54
|
+
}
|
|
55
|
+
transport = session.transport;
|
|
47
56
|
}
|
|
48
57
|
else if (!sessionId && (0, types_js_1.isInitializeRequest)(req.body)) {
|
|
49
58
|
transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
50
59
|
sessionIdGenerator: () => options?.sessionIdGenerator?.() || (0, crypto_1.randomUUID)(),
|
|
51
60
|
onsessioninitialized: (sessionId) => {
|
|
52
|
-
this.
|
|
61
|
+
this.sessionManager.setSession(sessionId, {
|
|
62
|
+
transport,
|
|
63
|
+
request: req,
|
|
64
|
+
});
|
|
53
65
|
},
|
|
54
66
|
enableJsonResponse: options?.enableJsonResponse,
|
|
55
67
|
eventStore: options?.eventStore,
|
|
56
68
|
});
|
|
57
69
|
transport.onclose = () => {
|
|
58
70
|
if (transport.sessionId) {
|
|
59
|
-
|
|
71
|
+
this.sessionManager.deleteSession(transport.sessionId);
|
|
60
72
|
}
|
|
61
73
|
};
|
|
74
|
+
await this.server.connect(transport);
|
|
62
75
|
}
|
|
63
76
|
else {
|
|
64
77
|
res.status(400).json({
|
|
@@ -75,11 +88,18 @@ let StreamableService = class StreamableService {
|
|
|
75
88
|
}
|
|
76
89
|
async handleGetRequest(req, res) {
|
|
77
90
|
const sessionId = req.headers['mcp-session-id'];
|
|
78
|
-
if (!sessionId || !this.
|
|
91
|
+
if (!sessionId || !this.sessionManager.getSession(sessionId)) {
|
|
79
92
|
res.status(400).send('Invalid or missing session ID');
|
|
80
93
|
return;
|
|
81
94
|
}
|
|
82
|
-
const
|
|
95
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
96
|
+
if (!session) {
|
|
97
|
+
throw new Error('Session not found');
|
|
98
|
+
}
|
|
99
|
+
const { transport } = session;
|
|
100
|
+
if (!(transport instanceof streamableHttp_js_1.StreamableHTTPServerTransport)) {
|
|
101
|
+
throw new Error('Invalid transport');
|
|
102
|
+
}
|
|
83
103
|
await transport.handleRequest(req, res);
|
|
84
104
|
}
|
|
85
105
|
async handleDeleteRequest(req, res) {
|
|
@@ -88,7 +108,11 @@ let StreamableService = class StreamableService {
|
|
|
88
108
|
res.status(400).json({ error: 'Missing sessionId' });
|
|
89
109
|
return;
|
|
90
110
|
}
|
|
91
|
-
const
|
|
111
|
+
const session = this.sessionManager.getSession(sessionId);
|
|
112
|
+
if (!session) {
|
|
113
|
+
throw new Error('Session not found');
|
|
114
|
+
}
|
|
115
|
+
const { transport } = session;
|
|
92
116
|
if (transport) {
|
|
93
117
|
this.logger.debug(`Closing streamable transport for sessionId: ${sessionId}`, 'STREAMABLE');
|
|
94
118
|
await transport.close();
|
|
@@ -97,7 +121,7 @@ let StreamableService = class StreamableService {
|
|
|
97
121
|
res.status(400).json({ error: 'Invalid sessionId format' });
|
|
98
122
|
return;
|
|
99
123
|
}
|
|
100
|
-
|
|
124
|
+
this.sessionManager.deleteSession(sessionId);
|
|
101
125
|
res.status(200).json({ success: true, sessionId });
|
|
102
126
|
}
|
|
103
127
|
else {
|
|
@@ -112,6 +136,7 @@ exports.StreamableService = StreamableService = __decorate([
|
|
|
112
136
|
__param(0, (0, common_1.Inject)('MCP_SERVER_OPTIONS')),
|
|
113
137
|
__param(1, (0, common_1.Inject)('MCP_TRANSPORT_OPTIONS')),
|
|
114
138
|
__metadata("design:paramtypes", [Object, Object, registry_service_1.RegistryService,
|
|
115
|
-
logger_service_1.McpLoggerService
|
|
139
|
+
logger_service_1.McpLoggerService,
|
|
140
|
+
session_manager_1.SessionManager])
|
|
116
141
|
], StreamableService);
|
|
117
142
|
//# sourceMappingURL=streamable.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAAoE;AACpE,0FAAmG;AACnG,iEAAyE;AACzE,2CAAkE;AAClE,mCAAoC;AAOpC,kEAAiE;AACjE,sEAAkE;
|
|
1
|
+
{"version":3,"file":"streamable.service.js","sourceRoot":"","sources":["../../../src/controllers/streamable/streamable.service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./mcp.module"), exports);
|
|
18
18
|
__exportStar(require("./interfaces"), exports);
|
|
19
19
|
__exportStar(require("./registry"), exports);
|
|
20
|
+
__exportStar(require("./services"), exports);
|
|
20
21
|
__exportStar(require("./decorators"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,+CAA6B;AAG7B,+CAA6B;AAG7B,6CAA2B;AAG3B,+CAA6B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,+CAA6B;AAG7B,+CAA6B;AAG7B,6CAA2B;AAG3B,6CAA2B;AAG3B,+CAA6B"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { CompleteResourceTemplateCallback, ListResourcesCallback } from '@modelcontextprotocol/sdk/server/mcp';
|
|
2
|
-
import {
|
|
1
|
+
import { CompleteResourceTemplateCallback, ListResourcesCallback } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { RequestHandlerExtra as SdkRequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
3
|
+
import { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import { z, ZodOptional, ZodRawShape, ZodType, ZodTypeAny, ZodTypeDef } from 'zod';
|
|
3
5
|
export interface ResourceBaseOptions {
|
|
4
6
|
name: string;
|
|
5
7
|
}
|
|
@@ -49,4 +51,32 @@ export interface TemplateCallbacks {
|
|
|
49
51
|
[variable: string]: CompleteResourceTemplateCallback;
|
|
50
52
|
};
|
|
51
53
|
}
|
|
54
|
+
export type RequestHandlerExtra = SdkRequestHandlerExtra<ServerRequest, ServerNotification> & {
|
|
55
|
+
headers: Record<string, string>;
|
|
56
|
+
};
|
|
57
|
+
export declare class ResourceUriHandlerParams {
|
|
58
|
+
readonly uri: URL;
|
|
59
|
+
readonly extra: RequestHandlerExtra;
|
|
60
|
+
private constructor();
|
|
61
|
+
static from(uri: URL, extra: RequestHandlerExtra): ResourceUriHandlerParams;
|
|
62
|
+
}
|
|
63
|
+
export declare class ResourceTemplateHandlerParams {
|
|
64
|
+
readonly uri: URL;
|
|
65
|
+
readonly variables?: Record<string, string>;
|
|
66
|
+
readonly extra: RequestHandlerExtra;
|
|
67
|
+
private constructor();
|
|
68
|
+
static from(uri: URL, extra: RequestHandlerExtra, variables?: Record<string, string>): ResourceTemplateHandlerParams;
|
|
69
|
+
}
|
|
70
|
+
export declare class PromptHandlerParams<Args extends PromptArgsRawShape | undefined = undefined> {
|
|
71
|
+
readonly args?: Args extends PromptArgsRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;
|
|
72
|
+
readonly extra: RequestHandlerExtra;
|
|
73
|
+
private constructor();
|
|
74
|
+
static from<Args extends PromptArgsRawShape | undefined>(extra: RequestHandlerExtra, args?: Args extends PromptArgsRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined): PromptHandlerParams<Args>;
|
|
75
|
+
}
|
|
76
|
+
export declare class ToolHandlerParams<Args extends ZodRawShape | undefined = undefined> {
|
|
77
|
+
readonly args?: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined;
|
|
78
|
+
readonly extra: RequestHandlerExtra;
|
|
79
|
+
private constructor();
|
|
80
|
+
static from<Args extends ZodRawShape | undefined>(extra: RequestHandlerExtra, args?: Args extends ZodRawShape ? z.objectOutputType<Args, ZodTypeAny> : undefined): ToolHandlerParams<Args>;
|
|
81
|
+
}
|
|
52
82
|
export {};
|
|
@@ -1,3 +1,54 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ToolHandlerParams = exports.PromptHandlerParams = exports.ResourceTemplateHandlerParams = exports.ResourceUriHandlerParams = void 0;
|
|
4
|
+
class ResourceUriHandlerParams {
|
|
5
|
+
uri;
|
|
6
|
+
extra;
|
|
7
|
+
constructor(uri, extra) {
|
|
8
|
+
this.uri = uri;
|
|
9
|
+
this.extra = extra;
|
|
10
|
+
}
|
|
11
|
+
static from(uri, extra) {
|
|
12
|
+
return new ResourceUriHandlerParams(uri, extra);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
exports.ResourceUriHandlerParams = ResourceUriHandlerParams;
|
|
16
|
+
class ResourceTemplateHandlerParams {
|
|
17
|
+
uri;
|
|
18
|
+
variables;
|
|
19
|
+
extra;
|
|
20
|
+
constructor(uri, extra, variables) {
|
|
21
|
+
this.uri = uri;
|
|
22
|
+
this.extra = extra;
|
|
23
|
+
this.variables = variables;
|
|
24
|
+
}
|
|
25
|
+
static from(uri, extra, variables) {
|
|
26
|
+
return new ResourceTemplateHandlerParams(uri, extra, variables);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ResourceTemplateHandlerParams = ResourceTemplateHandlerParams;
|
|
30
|
+
class PromptHandlerParams {
|
|
31
|
+
args;
|
|
32
|
+
extra;
|
|
33
|
+
constructor(extra, args) {
|
|
34
|
+
this.extra = extra;
|
|
35
|
+
this.args = args;
|
|
36
|
+
}
|
|
37
|
+
static from(extra, args) {
|
|
38
|
+
return new PromptHandlerParams(extra, args);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.PromptHandlerParams = PromptHandlerParams;
|
|
42
|
+
class ToolHandlerParams {
|
|
43
|
+
args;
|
|
44
|
+
extra;
|
|
45
|
+
constructor(extra, args) {
|
|
46
|
+
this.extra = extra;
|
|
47
|
+
this.args = args;
|
|
48
|
+
}
|
|
49
|
+
static from(extra, args) {
|
|
50
|
+
return new ToolHandlerParams(extra, args);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.ToolHandlerParams = ToolHandlerParams;
|
|
3
54
|
//# sourceMappingURL=capabilities.interface.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.interface.js","sourceRoot":"","sources":["../../src/interfaces/capabilities.interface.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"capabilities.interface.js","sourceRoot":"","sources":["../../src/interfaces/capabilities.interface.ts"],"names":[],"mappings":";;;AAmHA,MAAa,wBAAwB;IACnB,GAAG,CAAM;IACT,KAAK,CAAsB;IAE3C,YAAoB,GAAQ,EAAE,KAA0B;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,GAAQ,EAAE,KAA0B;QAC9C,OAAO,IAAI,wBAAwB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;CACF;AAZD,4DAYC;AAED,MAAa,6BAA6B;IACxB,GAAG,CAAM;IACT,SAAS,CAA0B;IACnC,KAAK,CAAsB;IAE3C,YACE,GAAQ,EACR,KAA0B,EAC1B,SAAkC;QAElC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,MAAM,CAAC,IAAI,CACT,GAAQ,EACR,KAA0B,EAC1B,SAAkC;QAElC,OAAO,IAAI,6BAA6B,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;CACF;AAtBD,sEAsBC;AAED,MAAa,mBAAmB;IAGd,IAAI,CAEN;IACE,KAAK,CAAsB;IAE3C,YACE,KAA0B,EAC1B,IAEa;QAEb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAA0B,EAC1B,IAEa;QAEb,OAAO,IAAI,mBAAmB,CAAO,KAAK,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;CACF;AA1BD,kDA0BC;AAED,MAAa,iBAAiB;IAGZ,IAAI,CAEN;IACE,KAAK,CAAsB;IAE3C,YACE,KAA0B,EAC1B,IAEa;QAEb,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,KAA0B,EAC1B,IAEa;QAEb,OAAO,IAAI,iBAAiB,CAAO,KAAK,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;CACF;AA1BD,8CA0BC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { PromptHandlerParams, ResourceTemplateHandlerParams, ResourceUriHandlerParams, ToolHandlerParams } from './capabilities.interface';
|
|
3
|
+
export interface McpExecutionContext extends ExecutionContext {
|
|
4
|
+
args: ResourceUriHandlerParams | ResourceTemplateHandlerParams | PromptHandlerParams | ToolHandlerParams;
|
|
5
|
+
getSessionId: () => string;
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.interface.js","sourceRoot":"","sources":["../../src/interfaces/context.interface.ts"],"names":[],"mappings":""}
|
package/dist/interfaces/index.js
CHANGED
|
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
17
|
+
__exportStar(require("./capabilities.interface"), exports);
|
|
18
|
+
__exportStar(require("./context.interface"), exports);
|
|
18
19
|
__exportStar(require("./mcp-server-options.interface"), exports);
|
|
19
20
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,sDAAoC;AACpC,iEAA+C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StreamableHTTPServerTransportOptions } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
-
import { ProtocolOptions } from '@modelcontextprotocol/sdk/shared/protocol';
|
|
3
|
-
import { Implementation, ServerCapabilities } from '@modelcontextprotocol/sdk/types';
|
|
2
|
+
import { ProtocolOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
3
|
+
import { Implementation, ServerCapabilities } from '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import { Provider, Type } from '@nestjs/common';
|
|
5
5
|
export type ServerOptions = {
|
|
6
6
|
instructions?: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.types.js","sourceRoot":"","sources":["../../src/interfaces/message.types.ts"],"names":[],"mappings":""}
|
package/dist/mcp.module.js
CHANGED
|
@@ -10,11 +10,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.McpModule = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
12
|
const core_1 = require("@nestjs/core");
|
|
13
|
+
const async_hooks_1 = require("async_hooks");
|
|
13
14
|
const sse_1 = require("./controllers/sse");
|
|
14
15
|
const streamable_1 = require("./controllers/streamable");
|
|
15
16
|
const discovery_service_1 = require("./registry/discovery.service");
|
|
16
17
|
const logger_service_1 = require("./registry/logger.service");
|
|
17
18
|
const registry_service_1 = require("./registry/registry.service");
|
|
19
|
+
const session_manager_1 = require("./services/session.manager");
|
|
18
20
|
let McpModule = McpModule_1 = class McpModule {
|
|
19
21
|
static getActiveTransportControllersAndProviders(transports) {
|
|
20
22
|
const controllers = new Set();
|
|
@@ -170,7 +172,17 @@ exports.McpModule = McpModule;
|
|
|
170
172
|
exports.McpModule = McpModule = McpModule_1 = __decorate([
|
|
171
173
|
(0, common_1.Module)({
|
|
172
174
|
imports: [core_1.DiscoveryModule],
|
|
173
|
-
providers: [
|
|
175
|
+
providers: [
|
|
176
|
+
registry_service_1.RegistryService,
|
|
177
|
+
discovery_service_1.DiscoveryService,
|
|
178
|
+
{
|
|
179
|
+
provide: async_hooks_1.AsyncLocalStorage,
|
|
180
|
+
useValue: new async_hooks_1.AsyncLocalStorage(),
|
|
181
|
+
},
|
|
182
|
+
logger_service_1.McpLoggerService,
|
|
183
|
+
session_manager_1.SessionManager,
|
|
184
|
+
],
|
|
185
|
+
exports: [session_manager_1.SessionManager],
|
|
174
186
|
})
|
|
175
187
|
], McpModule);
|
|
176
188
|
//# sourceMappingURL=mcp.module.js.map
|