@iludolf/mcp-adapter 1.0.0 → 1.0.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 +33 -4
- package/dist/services/mcp-http.service.d.ts +1 -0
- package/dist/services/mcp-http.service.js +11 -0
- package/dist/services/mcp-http.service.js.map +1 -1
- package/dist/services/mcp.service.d.ts +3 -8
- package/dist/services/mcp.service.js +12 -24
- package/dist/services/mcp.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
NestJS module for Model Context Protocol (MCP) integration. Enables your NestJS application to act as an MCP server, exposing tools, resources, and prompts to AI assistants.
|
|
4
4
|
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🔧 **Decorator-based API** - Use `@McpTool`, `@McpResource`, `@McpPrompt` decorators
|
|
8
|
+
- 🚀 **Multiple transports** - STDIO, SSE, HTTP support
|
|
9
|
+
- 🔄 **SSE Keep-alive** - Automatic ping to prevent connection timeouts
|
|
10
|
+
- 📦 **NestJS integration** - Full support for dependency injection
|
|
11
|
+
- 🔌 **Async configuration** - Use `forRootAsync` with ConfigService
|
|
12
|
+
|
|
5
13
|
## Installation
|
|
6
14
|
|
|
7
15
|
```bash
|
|
@@ -17,9 +25,18 @@ yarn add @iludolf/mcp-adapter
|
|
|
17
25
|
Make sure you have these peer dependencies installed:
|
|
18
26
|
|
|
19
27
|
```bash
|
|
20
|
-
npm install @modelcontextprotocol/sdk @nestjs/common @nestjs/core reflect-metadata rxjs zod
|
|
28
|
+
npm install @modelcontextprotocol/sdk@^1.10.0 @nestjs/common @nestjs/core reflect-metadata rxjs zod
|
|
21
29
|
```
|
|
22
30
|
|
|
31
|
+
| Package | Version |
|
|
32
|
+
|---------|---------|
|
|
33
|
+
| `@modelcontextprotocol/sdk` | `^1.10.0` |
|
|
34
|
+
| `@nestjs/common` | `^10.0.0 \|\| ^11.0.0` |
|
|
35
|
+
| `@nestjs/core` | `^10.0.0 \|\| ^11.0.0` |
|
|
36
|
+
| `reflect-metadata` | `^0.1.13 \|\| ^0.2.0` |
|
|
37
|
+
| `rxjs` | `^7.0.0` |
|
|
38
|
+
| `zod` | `^3.0.0` |
|
|
39
|
+
|
|
23
40
|
## Quick Start
|
|
24
41
|
|
|
25
42
|
### 1. Import the module
|
|
@@ -141,9 +158,15 @@ McpModule.forRootAsync({
|
|
|
141
158
|
|
|
142
159
|
When using SSE or HTTP transport, the following endpoints are available:
|
|
143
160
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
161
|
+
| Endpoint | Method | Description |
|
|
162
|
+
|----------|--------|-------------|
|
|
163
|
+
| `/{basePath}/sse` | GET | SSE connection endpoint |
|
|
164
|
+
| `/{basePath}/messages` | POST | Message handling endpoint |
|
|
165
|
+
| `/{basePath}/health` | GET | Health check endpoint |
|
|
166
|
+
|
|
167
|
+
### SSE Keep-alive
|
|
168
|
+
|
|
169
|
+
SSE connections automatically send keep-alive pings every 30 seconds to prevent timeout errors (`Body Timeout Error`). This is handled transparently - no configuration needed.
|
|
147
170
|
|
|
148
171
|
## Custom Logger
|
|
149
172
|
|
|
@@ -163,6 +186,12 @@ McpModule.forRoot({
|
|
|
163
186
|
})
|
|
164
187
|
```
|
|
165
188
|
|
|
189
|
+
## Compatibility
|
|
190
|
+
|
|
191
|
+
- **MCP SDK**: Uses the new `registerTool`, `registerPrompt`, `registerResource` API (SDK 1.10.0+)
|
|
192
|
+
- **NestJS**: Compatible with v10 and v11
|
|
193
|
+
- **Node.js**: Requires Node.js 18+
|
|
194
|
+
|
|
166
195
|
## License
|
|
167
196
|
|
|
168
197
|
MIT
|
|
@@ -6,6 +6,7 @@ export declare class McpHttpService {
|
|
|
6
6
|
private readonly logger;
|
|
7
7
|
private readonly loggerCtx;
|
|
8
8
|
private transports;
|
|
9
|
+
private keepAliveIntervals;
|
|
9
10
|
constructor(mcpService: McpService, logger: McpLogger);
|
|
10
11
|
handleSSE(res: Response, messagesPath?: string): Promise<void>;
|
|
11
12
|
handleMessage(req: Request, res: Response): Promise<void>;
|
|
@@ -17,12 +17,14 @@ const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js");
|
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
18
|
const constants_1 = require("../constants");
|
|
19
19
|
const mcp_service_1 = require("./mcp.service");
|
|
20
|
+
const KEEP_ALIVE_INTERVAL = 30000;
|
|
20
21
|
let McpHttpService = class McpHttpService {
|
|
21
22
|
constructor(mcpService, logger) {
|
|
22
23
|
this.mcpService = mcpService;
|
|
23
24
|
this.logger = logger;
|
|
24
25
|
this.loggerCtx = "McpHttpService";
|
|
25
26
|
this.transports = {};
|
|
27
|
+
this.keepAliveIntervals = {};
|
|
26
28
|
}
|
|
27
29
|
async handleSSE(res, messagesPath) {
|
|
28
30
|
const basePath = this.mcpService.getOptions().basePath || "mcp";
|
|
@@ -31,8 +33,17 @@ let McpHttpService = class McpHttpService {
|
|
|
31
33
|
const sessionId = transport.sessionId;
|
|
32
34
|
this.transports[sessionId] = transport;
|
|
33
35
|
this.logger.info(`New SSE connection established: ${sessionId}`, this.loggerCtx);
|
|
36
|
+
this.keepAliveIntervals[sessionId] = setInterval(() => {
|
|
37
|
+
if (!res.writableEnded) {
|
|
38
|
+
res.write(": ping\n\n");
|
|
39
|
+
}
|
|
40
|
+
}, KEEP_ALIVE_INTERVAL);
|
|
34
41
|
res.on("close", () => {
|
|
35
42
|
this.logger.info(`SSE connection closed: ${sessionId}`, this.loggerCtx);
|
|
43
|
+
if (this.keepAliveIntervals[sessionId]) {
|
|
44
|
+
clearInterval(this.keepAliveIntervals[sessionId]);
|
|
45
|
+
delete this.keepAliveIntervals[sessionId];
|
|
46
|
+
}
|
|
36
47
|
delete this.transports[sessionId];
|
|
37
48
|
transport
|
|
38
49
|
.close()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-http.service.js","sourceRoot":"","sources":["../../src/services/mcp-http.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oEAA4E;AAC5E,2CAAmD;AAGnD,4CAAyC;AAEzC,+CAA0C;
|
|
1
|
+
{"version":3,"file":"mcp-http.service.js","sourceRoot":"","sources":["../../src/services/mcp-http.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { McpServer,
|
|
1
|
+
import { McpServer, ReadResourceCallback, ReadResourceTemplateCallback } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { Prompt as PromptType } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
-
import { ZodOptional, ZodRawShape, ZodType, ZodTypeDef } from "zod";
|
|
4
3
|
import { McpLogger, McpModuleOptions, ResourceOptions, ToolOptions } from "../interfaces";
|
|
5
|
-
type PromptArgsRawShape = {
|
|
6
|
-
[k: string]: ZodType<string, ZodTypeDef, string> | ZodOptional<ZodType<string, ZodTypeDef, string>>;
|
|
7
|
-
};
|
|
8
4
|
export declare class McpService {
|
|
9
5
|
private readonly options;
|
|
10
6
|
private readonly logger;
|
|
@@ -14,8 +10,7 @@ export declare class McpService {
|
|
|
14
10
|
getServer(): McpServer;
|
|
15
11
|
getOptions(): McpModuleOptions;
|
|
16
12
|
registerResource(definition: ResourceOptions, handler: ReadResourceCallback | ReadResourceTemplateCallback): import("@modelcontextprotocol/sdk/server/mcp").RegisteredResourceTemplate | import("@modelcontextprotocol/sdk/server/mcp").RegisteredResource | undefined;
|
|
17
|
-
registerPrompt(definition: PromptType, handler:
|
|
18
|
-
registerTool(definition: ToolOptions, handler:
|
|
13
|
+
registerPrompt(definition: PromptType, handler: any): any;
|
|
14
|
+
registerTool(definition: ToolOptions, handler: any): any;
|
|
19
15
|
private isTemplateResource;
|
|
20
16
|
}
|
|
21
|
-
export {};
|
|
@@ -46,10 +46,10 @@ let McpService = class McpService {
|
|
|
46
46
|
const template = new mcp_js_1.ResourceTemplate(definition.uriTemplate, {
|
|
47
47
|
list: undefined,
|
|
48
48
|
});
|
|
49
|
-
return this.server.
|
|
49
|
+
return this.server.registerResource(definition.name, template, metadata, handler);
|
|
50
50
|
}
|
|
51
51
|
else if (definition.uriTemplate instanceof mcp_js_1.ResourceTemplate) {
|
|
52
|
-
return this.server.
|
|
52
|
+
return this.server.registerResource(definition.name, definition.uriTemplate, metadata, handler);
|
|
53
53
|
}
|
|
54
54
|
else {
|
|
55
55
|
this.logger.error("Invalid uriTemplate type for template resource.", this.loggerCtx);
|
|
@@ -57,7 +57,7 @@ let McpService = class McpService {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
|
-
return this.server.
|
|
60
|
+
return this.server.registerResource(definition.name, definition.uri, metadata, handler);
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
registerPrompt(definition, handler) {
|
|
@@ -68,7 +68,7 @@ let McpService = class McpService {
|
|
|
68
68
|
this.logger.info(`Registering prompt: ${definition.name}`, this.loggerCtx);
|
|
69
69
|
const description = definition.description || "";
|
|
70
70
|
if (!definition.arguments || definition.arguments.length === 0) {
|
|
71
|
-
return this.server.
|
|
71
|
+
return this.server.registerPrompt(definition.name, { description }, handler);
|
|
72
72
|
}
|
|
73
73
|
const argsSchema = {};
|
|
74
74
|
for (const arg of definition.arguments) {
|
|
@@ -89,9 +89,9 @@ let McpService = class McpService {
|
|
|
89
89
|
}
|
|
90
90
|
if (Object.keys(argsSchema).length === 0) {
|
|
91
91
|
this.logger.warn(`Prompt "${definition.name}" arguments processing resulted in empty schema. Registering as no-argument prompt.`, this.loggerCtx);
|
|
92
|
-
return this.server.
|
|
92
|
+
return this.server.registerPrompt(definition.name, { description }, handler);
|
|
93
93
|
}
|
|
94
|
-
return this.server.
|
|
94
|
+
return this.server.registerPrompt(definition.name, { description, argsSchema }, handler);
|
|
95
95
|
}
|
|
96
96
|
registerTool(definition, handler) {
|
|
97
97
|
if (!definition || !definition.name) {
|
|
@@ -99,26 +99,14 @@ let McpService = class McpService {
|
|
|
99
99
|
return;
|
|
100
100
|
}
|
|
101
101
|
this.logger.info(`Registering tool: ${definition.name}`, this.loggerCtx);
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const specificHandler = handler;
|
|
106
|
-
if (description) {
|
|
107
|
-
return this.server.tool(definition.name, description, paramsSchema, specificHandler);
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
this.server.tool(definition.name, paramsSchema, specificHandler);
|
|
111
|
-
}
|
|
102
|
+
const config = {};
|
|
103
|
+
if (definition.description) {
|
|
104
|
+
config.description = definition.description;
|
|
112
105
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (description) {
|
|
116
|
-
this.server.tool(definition.name, description, specificHandler);
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
this.server.tool(definition.name, specificHandler);
|
|
120
|
-
}
|
|
106
|
+
if (definition.paramsSchema && Object.keys(definition.paramsSchema).length > 0) {
|
|
107
|
+
config.inputSchema = definition.paramsSchema;
|
|
121
108
|
}
|
|
109
|
+
return this.server.registerTool(definition.name, config, handler);
|
|
122
110
|
}
|
|
123
111
|
isTemplateResource(options) {
|
|
124
112
|
return "uriTemplate" in options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.service.js","sourceRoot":"","sources":["../../src/services/mcp.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"mcp.service.js","sourceRoot":"","sources":["../../src/services/mcp.service.ts"],"names":[],"mappings":"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"}
|