@jissp/nestjs-mcp-server 0.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.
Files changed (53) hide show
  1. package/README.md +163 -0
  2. package/dist/lib/index.d.ts +2 -0
  3. package/dist/lib/index.js +19 -0
  4. package/dist/lib/index.js.map +1 -0
  5. package/dist/lib/mcp-server/base.executor.d.ts +4 -0
  6. package/dist/lib/mcp-server/base.executor.js +3 -0
  7. package/dist/lib/mcp-server/base.executor.js.map +1 -0
  8. package/dist/lib/mcp-server/decorators/index.d.ts +2 -0
  9. package/dist/lib/mcp-server/decorators/index.js +19 -0
  10. package/dist/lib/mcp-server/decorators/index.js.map +1 -0
  11. package/dist/lib/mcp-server/decorators/mcp-resource.decorator.d.ts +8 -0
  12. package/dist/lib/mcp-server/decorators/mcp-resource.decorator.js +8 -0
  13. package/dist/lib/mcp-server/decorators/mcp-resource.decorator.js.map +1 -0
  14. package/dist/lib/mcp-server/decorators/mcp-tool.decorator.d.ts +7 -0
  15. package/dist/lib/mcp-server/decorators/mcp-tool.decorator.js +8 -0
  16. package/dist/lib/mcp-server/decorators/mcp-tool.decorator.js.map +1 -0
  17. package/dist/lib/mcp-server/guards/index.d.ts +1 -0
  18. package/dist/lib/mcp-server/guards/index.js +18 -0
  19. package/dist/lib/mcp-server/guards/index.js.map +1 -0
  20. package/dist/lib/mcp-server/guards/mcp-session-id.guard.d.ts +4 -0
  21. package/dist/lib/mcp-server/guards/mcp-session-id.guard.js +29 -0
  22. package/dist/lib/mcp-server/guards/mcp-session-id.guard.js.map +1 -0
  23. package/dist/lib/mcp-server/index.d.ts +8 -0
  24. package/dist/lib/mcp-server/index.js +25 -0
  25. package/dist/lib/mcp-server/index.js.map +1 -0
  26. package/dist/lib/mcp-server/mcp-metadata-registry.service.d.ts +21 -0
  27. package/dist/lib/mcp-server/mcp-metadata-registry.service.js +93 -0
  28. package/dist/lib/mcp-server/mcp-metadata-registry.service.js.map +1 -0
  29. package/dist/lib/mcp-server/mcp-server.controller.d.ts +12 -0
  30. package/dist/lib/mcp-server/mcp-server.controller.js +64 -0
  31. package/dist/lib/mcp-server/mcp-server.controller.js.map +1 -0
  32. package/dist/lib/mcp-server/mcp-server.module.d.ts +6 -0
  33. package/dist/lib/mcp-server/mcp-server.module.js +40 -0
  34. package/dist/lib/mcp-server/mcp-server.module.js.map +1 -0
  35. package/dist/lib/mcp-server/mcp-server.service.d.ts +18 -0
  36. package/dist/lib/mcp-server/mcp-server.service.js +133 -0
  37. package/dist/lib/mcp-server/mcp-server.service.js.map +1 -0
  38. package/dist/lib/mcp-server/mcp-server.types.d.ts +28 -0
  39. package/dist/lib/mcp-server/mcp-server.types.js +3 -0
  40. package/dist/lib/mcp-server/mcp-server.types.js.map +1 -0
  41. package/dist/lib/metadata-scanner/index.d.ts +3 -0
  42. package/dist/lib/metadata-scanner/index.js +20 -0
  43. package/dist/lib/metadata-scanner/index.js.map +1 -0
  44. package/dist/lib/metadata-scanner/metadata-scanner.module.d.ts +2 -0
  45. package/dist/lib/metadata-scanner/metadata-scanner.module.js +23 -0
  46. package/dist/lib/metadata-scanner/metadata-scanner.module.js.map +1 -0
  47. package/dist/lib/metadata-scanner/metadata-scanner.service.d.ts +9 -0
  48. package/dist/lib/metadata-scanner/metadata-scanner.service.js +66 -0
  49. package/dist/lib/metadata-scanner/metadata-scanner.service.js.map +1 -0
  50. package/dist/lib/metadata-scanner/metadata-scanner.types.d.ts +8 -0
  51. package/dist/lib/metadata-scanner/metadata-scanner.types.js +3 -0
  52. package/dist/lib/metadata-scanner/metadata-scanner.types.js.map +1 -0
  53. package/package.json +97 -0
package/README.md ADDED
@@ -0,0 +1,163 @@
1
+ # jissp-mcp-server-nestjs
2
+
3
+ NestJS 기반의 Model Context Protocol (MCP) 서버 라이브러리입니다. 데코레이터와 메타데이터 스캐닝을 통해 MCP 리소스와 도구를 간편하게 정의하고 관리할 수 있습니다.
4
+
5
+ ## 설치
6
+
7
+ ```bash
8
+ npm install jissp-mcp-server-nestjs
9
+ ```
10
+
11
+ ## 주요 기능
12
+
13
+ - **데코레이터 기반 정의**: `@McpTool`, `@McpResource` 데코레이터로 리소스와 도구 정의
14
+ - **자동 메타데이터 스캔**: 클래스와 메서드의 메타데이터 자동 수집
15
+ - **Executor 패턴**: 커스텀 executor를 통한 확장 가능한 아키텍처
16
+ - **JSON-RPC 통신**: 표준 JSON-RPC 2.0 프로토콜 지원
17
+ - **세션 관리**: 세션 ID 기반 요청 추적 (Header: `mcp-session-id`)
18
+
19
+ ## 빠른 시작
20
+
21
+ ### 1. 전역 모듈 설정
22
+
23
+ `AppModule`에서 `forRoot()`를 호출하여 MCP 서버의 핵심 인프라(Controller, Service 등)를 전역적으로 설정합니다.
24
+
25
+ ```typescript
26
+ import { Module } from '@nestjs/common';
27
+ import { McpServerModule } from 'jissp-mcp-server-nestjs';
28
+
29
+ @Module({
30
+ imports: [
31
+ McpServerModule.forRoot(),
32
+ ],
33
+ })
34
+ export class AppModule {
35
+ }
36
+ ```
37
+
38
+ ### 2. 도구(Tool) 및 리소스(Resource) 등록
39
+
40
+ `forFeature()`를 사용하여 특정 도구나 리소스를 구현한 `executors`를 등록합니다.
41
+
42
+ ```typescript
43
+ import { Module } from '@nestjs/common';
44
+ import { McpServerModule } from 'jissp-mcp-server-nestjs';
45
+ import { MyToolExecutor } from './my-tool.executor';
46
+ import { MyResourceService } from './my-resource.service';
47
+
48
+ @Module({
49
+ imports: [
50
+ McpServerModule.forFeature({
51
+ executors: [MyToolExecutor, MyResourceService],
52
+ }),
53
+ ],
54
+ })
55
+ export class MyFeatureModule {
56
+ }
57
+ ```
58
+
59
+ ### 3. 도구(Tool) 정의
60
+
61
+ 도구는 `BaseExecutor` 인터페이스를 구현해야 하며, 실행 메서드에 `@McpTool` 데코레이터를 사용합니다.
62
+
63
+ ```typescript
64
+ import { Injectable } from '@nestjs/common';
65
+ import { McpTool, BaseExecutor, JsonRpcCallRequest } from 'jissp-mcp-server-nestjs';
66
+
67
+ @Injectable()
68
+ export class MyToolExecutor implements BaseExecutor {
69
+ @McpTool({
70
+ name: 'calculate-sum',
71
+ description: '두 숫자의 합을 계산합니다.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ a: { type: 'number' },
76
+ b: { type: 'number' },
77
+ },
78
+ required: ['a', 'b'],
79
+ },
80
+ })
81
+ async execute(request: JsonRpcCallRequest) {
82
+ const { a, b } = request.params.arguments as { a: number; b: number };
83
+ return a + b;
84
+ }
85
+ }
86
+ ```
87
+
88
+ ### 4. 리소스(Resource) 정의
89
+
90
+ 리소스는 서비스 내의 메서드에 `@McpResource` 데코레이터를 사용하여 정의합니다. URI 템플릿을 지원합니다.
91
+
92
+ ```typescript
93
+ import { Injectable } from '@nestjs/common';
94
+ import { McpResource } from 'jissp-mcp-server-nestjs';
95
+
96
+ @Injectable()
97
+ export class MyResourceService {
98
+ @McpResource({
99
+ uri: 'file://{path}',
100
+ name: 'system-file',
101
+ description: '시스템 파일을 읽어옵니다.',
102
+ mimeType: 'text/plain',
103
+ })
104
+ async getFileContent(request: any) {
105
+ const { path } = request.params.arguments;
106
+ // 파일 읽기 로직...
107
+ return `Content of ${path}`;
108
+ }
109
+ }
110
+ ```
111
+
112
+ ## API 레퍼런스
113
+
114
+ ### McpServerModule
115
+
116
+ #### `forRoot()`
117
+
118
+ MCP 서버의 핵심 기능(SSE 스트림, JSON-RPC 처리 등)을 전역 모듈로 등록합니다.
119
+
120
+ #### `forFeature(options: McpServerFeatureOptions)`
121
+
122
+ 특정 도구(Tool)나 리소스(Resource)를 담당할 프로바이더를 등록합니다.
123
+
124
+ - `executors`: `BaseExecutor`를 구현하거나 MCP 데코레이터가 사용된 프로바이더 배열.
125
+ - `imports`: (선택) `executors`가 의존하는 다른 모듈들.
126
+
127
+ ### 데코레이터
128
+
129
+ #### `@McpTool(options: McpToolOptions)`
130
+
131
+ 메서드를 MCP 도구로 등록합니다. 해당 클래스는 `BaseExecutor`를 구현해야 합니다.
132
+
133
+ ```typescript
134
+ {
135
+ name: string; // 도구 이름 (필수)
136
+ description ? : string; // 도구 설명
137
+ inputSchema ? : any; // JSON Schema 형식의 입력 파라미터 정의
138
+ }
139
+ ```
140
+
141
+ #### `@McpResource(options: McpResourceOptions)`
142
+
143
+ 메서드를 MCP 리소스로 등록합니다.
144
+
145
+ ```typescript
146
+ {
147
+ uri: string; // 리소스 URI 템플릿 (필수, 예: 'myschema://{id}')
148
+ name: string; // 리소스 이름 (필수)
149
+ description ? : string; // 리소스 설명
150
+ mimeType ? : string; // 리소스의 MIME 타입
151
+ }
152
+ ```
153
+
154
+ ## 아키텍처
155
+
156
+ ### 요청 흐름
157
+
158
+ 1. **클라이언트 SSE 연결** → `GET /mcp` (Header에 `mcp-session-id` 포함 권장)
159
+ 2. **JSON-RPC 요청** → `POST /mcp`
160
+ 3. **McpServerController** → 요청 수신 및 세션 검증 (`McpSessionIdGuard`)
161
+ 4. **McpServerService** → 메서드 핸들러 조회 및 `McpMetadataRegistryService` 참조
162
+ 5. **Executor / Handler** → `@McpTool` 클래스의 `execute` 또는 `@McpResource` 메서드 실행
163
+ 6. **응답** → JSON-RPC 결과 반환
@@ -0,0 +1,2 @@
1
+ export * from './mcp-server';
2
+ export * from './metadata-scanner';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mcp-server"), exports);
18
+ __exportStar(require("./metadata-scanner"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,qDAAmC"}
@@ -0,0 +1,4 @@
1
+ import { JsonRpcCallRequest } from './mcp-server.types';
2
+ export interface BaseExecutor<T = unknown> {
3
+ execute: (request: JsonRpcCallRequest) => T | Promise<T>;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=base.executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.executor.js","sourceRoot":"","sources":["../../../lib/mcp-server/base.executor.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './mcp-tool.decorator';
2
+ export * from './mcp-resource.decorator';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mcp-tool.decorator"), exports);
18
+ __exportStar(require("./mcp-resource.decorator"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/mcp-server/decorators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,2DAAyC"}
@@ -0,0 +1,8 @@
1
+ export declare const MCP_RESOURCE_METADATA = "MCP_RESOURCE_METADATA";
2
+ export interface McpResourceOptions {
3
+ uri: string;
4
+ name: string;
5
+ mimeType?: string;
6
+ description?: string;
7
+ }
8
+ export declare const McpResource: (options: McpResourceOptions) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.McpResource = exports.MCP_RESOURCE_METADATA = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.MCP_RESOURCE_METADATA = 'MCP_RESOURCE_METADATA';
6
+ const McpResource = (options) => (0, common_1.SetMetadata)(exports.MCP_RESOURCE_METADATA, options);
7
+ exports.McpResource = McpResource;
8
+ //# sourceMappingURL=mcp-resource.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-resource.decorator.js","sourceRoot":"","sources":["../../../../lib/mcp-server/decorators/mcp-resource.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,qBAAqB,GAAG,uBAAuB,CAAC;AAStD,MAAM,WAAW,GAAG,CAAC,OAA2B,EAAE,EAAE,CACzD,IAAA,oBAAW,EAAC,6BAAqB,EAAE,OAAO,CAAC,CAAC;AADjC,QAAA,WAAW,eACsB"}
@@ -0,0 +1,7 @@
1
+ export declare const MCP_TOOL_METADATA = "MCP_TOOL_METADATA";
2
+ export interface McpToolOptions {
3
+ name: string;
4
+ description?: string;
5
+ inputSchema?: any;
6
+ }
7
+ export declare const McpTool: (options: McpToolOptions) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.McpTool = exports.MCP_TOOL_METADATA = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.MCP_TOOL_METADATA = 'MCP_TOOL_METADATA';
6
+ const McpTool = (options) => (0, common_1.SetMetadata)(exports.MCP_TOOL_METADATA, options);
7
+ exports.McpTool = McpTool;
8
+ //# sourceMappingURL=mcp-tool.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool.decorator.js","sourceRoot":"","sources":["../../../../lib/mcp-server/decorators/mcp-tool.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAA6C;AAEhC,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AAQ9C,MAAM,OAAO,GAAG,CAAC,OAAuB,EAAE,EAAE,CACjD,IAAA,oBAAW,EAAC,yBAAiB,EAAE,OAAO,CAAC,CAAC;AAD7B,QAAA,OAAO,WACsB"}
@@ -0,0 +1 @@
1
+ export * from './mcp-session-id.guard';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mcp-session-id.guard"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../lib/mcp-server/guards/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC"}
@@ -0,0 +1,4 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ export declare class McpSessionIdGuard implements CanActivate {
3
+ canActivate(context: ExecutionContext): boolean;
4
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.McpSessionIdGuard = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let McpSessionIdGuard = class McpSessionIdGuard {
12
+ canActivate(context) {
13
+ const request = context.switchToHttp().getRequest();
14
+ const body = request.body;
15
+ if (body.method === 'initialize') {
16
+ return true;
17
+ }
18
+ const sessionId = request.headers['mcp-session-id'];
19
+ if (!sessionId) {
20
+ throw new common_1.BadRequestException('Missing MCP-Session-Id header');
21
+ }
22
+ return true;
23
+ }
24
+ };
25
+ exports.McpSessionIdGuard = McpSessionIdGuard;
26
+ exports.McpSessionIdGuard = McpSessionIdGuard = __decorate([
27
+ (0, common_1.Injectable)()
28
+ ], McpSessionIdGuard);
29
+ //# sourceMappingURL=mcp-session-id.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-session-id.guard.js","sourceRoot":"","sources":["../../../../lib/mcp-server/guards/mcp-session-id.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,2CAKwB;AAIjB,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAC5B,WAAW,CAAC,OAAyB;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAsB,CAAC;QAG5C,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAjBY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;GACA,iBAAiB,CAiB7B"}
@@ -0,0 +1,8 @@
1
+ export * from './guards';
2
+ export * from './decorators';
3
+ export * from './mcp-server.types';
4
+ export * from './base.executor';
5
+ export * from './mcp-metadata-registry.service';
6
+ export * from './mcp-server.controller';
7
+ export * from './mcp-server.service';
8
+ export * from './mcp-server.module';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./guards"), exports);
18
+ __exportStar(require("./decorators"), exports);
19
+ __exportStar(require("./mcp-server.types"), exports);
20
+ __exportStar(require("./base.executor"), exports);
21
+ __exportStar(require("./mcp-metadata-registry.service"), exports);
22
+ __exportStar(require("./mcp-server.controller"), exports);
23
+ __exportStar(require("./mcp-server.service"), exports);
24
+ __exportStar(require("./mcp-server.module"), exports);
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/mcp-server/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,+CAA6B;AAC7B,qDAAmC;AACnC,kDAAgC;AAChC,kEAAgD;AAChD,0DAAwC;AACxC,uDAAqC;AACrC,sDAAoC"}
@@ -0,0 +1,21 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { MetadataScannerService } from '../metadata-scanner';
3
+ import { McpResourceOptions, McpToolOptions } from './decorators';
4
+ import { BaseExecutor } from './base.executor';
5
+ export declare class McpMetadataRegistryService implements OnModuleInit {
6
+ private readonly metadataScanner;
7
+ private tools;
8
+ private resources;
9
+ constructor(metadataScanner: MetadataScannerService);
10
+ onModuleInit(): void;
11
+ private scanTools;
12
+ private scanResources;
13
+ getTools(): McpToolOptions[];
14
+ getToolExecutor(name: string): BaseExecutor<unknown> | undefined;
15
+ getResources(): McpResourceOptions[];
16
+ getResourceHandler(uri: string): {
17
+ handler: Function;
18
+ params: Record<string, string>;
19
+ } | null;
20
+ private matchUri;
21
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpMetadataRegistryService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const metadata_scanner_1 = require("../metadata-scanner");
15
+ const decorators_1 = require("./decorators");
16
+ let McpMetadataRegistryService = class McpMetadataRegistryService {
17
+ metadataScanner;
18
+ tools = new Map();
19
+ resources = new Map();
20
+ constructor(metadataScanner) {
21
+ this.metadataScanner = metadataScanner;
22
+ }
23
+ onModuleInit() {
24
+ this.scanTools();
25
+ this.scanResources();
26
+ }
27
+ scanTools() {
28
+ const metadataList = this.metadataScanner.scan({
29
+ metadataKey: decorators_1.MCP_TOOL_METADATA,
30
+ });
31
+ metadataList.forEach(({ metadata, instance }) => {
32
+ const toolMeta = metadata;
33
+ this.tools.set(toolMeta.name, {
34
+ executor: instance,
35
+ metadata,
36
+ });
37
+ });
38
+ }
39
+ scanResources() {
40
+ const metadataList = this.metadataScanner.scan({
41
+ metadataKey: decorators_1.MCP_RESOURCE_METADATA,
42
+ });
43
+ metadataList.forEach(({ metadata, instance, methodName }) => {
44
+ this.resources.set(metadata.uri, {
45
+ handler: instance[methodName].bind(instance),
46
+ metadata,
47
+ });
48
+ });
49
+ }
50
+ getTools() {
51
+ return Array.from(this.tools.values()).map((t) => t.metadata);
52
+ }
53
+ getToolExecutor(name) {
54
+ return this.tools.get(name)?.executor;
55
+ }
56
+ getResources() {
57
+ return Array.from(this.resources.values()).map((r) => r.metadata);
58
+ }
59
+ getResourceHandler(uri) {
60
+ for (const [template, resource] of this.resources.entries()) {
61
+ const match = this.matchUri(template, uri);
62
+ if (match) {
63
+ return {
64
+ handler: resource.handler,
65
+ params: match,
66
+ };
67
+ }
68
+ }
69
+ return null;
70
+ }
71
+ matchUri(template, uri) {
72
+ const paramNames = [];
73
+ const regexSource = template.replace(/{([^}]+)}/g, (_, paramName) => {
74
+ paramNames.push(paramName);
75
+ return '([^/]+)';
76
+ });
77
+ const regex = new RegExp(`^${regexSource}$`);
78
+ const match = uri.match(regex);
79
+ if (!match)
80
+ return null;
81
+ const params = {};
82
+ paramNames.forEach((name, index) => {
83
+ params[name] = decodeURIComponent(match[index + 1]);
84
+ });
85
+ return params;
86
+ }
87
+ };
88
+ exports.McpMetadataRegistryService = McpMetadataRegistryService;
89
+ exports.McpMetadataRegistryService = McpMetadataRegistryService = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [metadata_scanner_1.MetadataScannerService])
92
+ ], McpMetadataRegistryService);
93
+ //# sourceMappingURL=mcp-metadata-registry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-metadata-registry.service.js","sourceRoot":"","sources":["../../../lib/mcp-server/mcp-metadata-registry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA0D;AAC1D,0DAA6D;AAC7D,6CAKsB;AAIf,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IAUR;IATrB,KAAK,GAAG,IAAI,GAAG,EAGpB,CAAC;IACI,SAAS,GAAG,IAAI,GAAG,EAGxB,CAAC;IAEJ,YAA6B,eAAuC;QAAvC,oBAAe,GAAf,eAAe,CAAwB;IAAG,CAAC;IAExE,YAAY;QACV,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,SAAS;QACf,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,8BAAiB;SAC/B,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,QAA0B,CAAC;YAC5C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC5B,QAAQ,EAAE,QAAQ;gBAClB,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,aAAa;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,kCAAqB;SACnC,CAAC,CAAC;QAEH,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;YAC1D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;gBAC/B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC5C,QAAQ;aACT,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAChE,CAAC;IAED,eAAe,CAAC,IAAY;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACxC,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACpE,CAAC;IAED,kBAAkB,CAAC,GAAW;QAC5B,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,KAAK;iBACd,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,QAAQ,CACd,QAAgB,EAChB,GAAW;QAEX,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE;YAClE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,WAAW,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE/B,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACjC,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAA;AA3FY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,mBAAU,GAAE;qCAWmC,yCAAsB;GAVzD,0BAA0B,CA2FtC"}
@@ -0,0 +1,12 @@
1
+ import type { Request, Response } from 'express';
2
+ import { Observable } from 'rxjs';
3
+ import { MessageEvent } from '@nestjs/common';
4
+ import type { JsonRpcRequest } from './mcp-server.types';
5
+ import { McpServerService } from './mcp-server.service';
6
+ export declare class McpServerController {
7
+ private readonly mcpService;
8
+ private eventSubject;
9
+ constructor(mcpService: McpServerService);
10
+ sse(req: Request): Observable<MessageEvent>;
11
+ handleIncomingMessage(body: JsonRpcRequest, res: Response): Promise<Response<any, Record<string, any>>>;
12
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.McpServerController = void 0;
16
+ const rxjs_1 = require("rxjs");
17
+ const common_1 = require("@nestjs/common");
18
+ const mcp_server_service_1 = require("./mcp-server.service");
19
+ const guards_1 = require("./guards");
20
+ let McpServerController = class McpServerController {
21
+ mcpService;
22
+ eventSubject = new rxjs_1.Subject();
23
+ constructor(mcpService) {
24
+ this.mcpService = mcpService;
25
+ }
26
+ sse(req) {
27
+ const sessionId = req.headers['mcp-session-id'];
28
+ console.log(`SSE Connected with Session ID: ${sessionId?.toString() ?? 'unknown'}`);
29
+ return this.eventSubject.asObservable();
30
+ }
31
+ async handleIncomingMessage(body, res) {
32
+ const response = await this.mcpService.handleMessage(body);
33
+ if (!response) {
34
+ return res.status(common_1.HttpStatus.ACCEPTED).send();
35
+ }
36
+ if (body.method === 'initialize') {
37
+ res.setHeader('MCP-Session-Id', crypto.randomUUID());
38
+ }
39
+ return res.status(common_1.HttpStatus.OK).json(response.result);
40
+ }
41
+ };
42
+ exports.McpServerController = McpServerController;
43
+ __decorate([
44
+ (0, common_1.Sse)(),
45
+ (0, common_1.Get)(),
46
+ __param(0, (0, common_1.Req)()),
47
+ __metadata("design:type", Function),
48
+ __metadata("design:paramtypes", [Object]),
49
+ __metadata("design:returntype", rxjs_1.Observable)
50
+ ], McpServerController.prototype, "sse", null);
51
+ __decorate([
52
+ (0, common_1.UseGuards)(guards_1.McpSessionIdGuard),
53
+ (0, common_1.Post)(),
54
+ __param(0, (0, common_1.Body)()),
55
+ __param(1, (0, common_1.Res)()),
56
+ __metadata("design:type", Function),
57
+ __metadata("design:paramtypes", [Object, Object]),
58
+ __metadata("design:returntype", Promise)
59
+ ], McpServerController.prototype, "handleIncomingMessage", null);
60
+ exports.McpServerController = McpServerController = __decorate([
61
+ (0, common_1.Controller)('mcp'),
62
+ __metadata("design:paramtypes", [mcp_server_service_1.McpServerService])
63
+ ], McpServerController);
64
+ //# sourceMappingURL=mcp-server.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.controller.js","sourceRoot":"","sources":["../../../lib/mcp-server/mcp-server.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,+BAA2C;AAC3C,2CAWwB;AAExB,6DAAwD;AACxD,qCAA6C;AAGtC,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAGD;IAFrB,YAAY,GAAG,IAAI,cAAO,EAAgB,CAAC;IAEnD,YAA6B,UAA4B;QAA5B,eAAU,GAAV,UAAU,CAAkB;IAAG,CAAC;IAO7D,GAAG,CAAQ,GAAY;QACrB,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CACT,kCAAkC,SAAS,EAAE,QAAQ,EAAE,IAAI,SAAS,EAAE,CACvE,CAAC;QAEF,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;IAC1C,CAAC;IAOK,AAAN,KAAK,CAAC,qBAAqB,CACjB,IAAoB,EACrB,GAAa;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,mBAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACjC,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,GAAG,CAAC,MAAM,CAAC,mBAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;CAQF,CAAA;AA9CY,kDAAmB;AAU9B;IAFC,IAAA,YAAG,GAAE;IACL,IAAA,YAAG,GAAE;IACD,WAAA,IAAA,YAAG,GAAE,CAAA;;;oCAAgB,iBAAU;8CAOnC;AAOK;IAFL,IAAA,kBAAS,EAAC,0BAAiB,CAAC;IAC5B,IAAA,aAAI,GAAE;IAEJ,WAAA,IAAA,aAAI,GAAE,CAAA;IACN,WAAA,IAAA,YAAG,GAAE,CAAA;;;;gEAYP;8BAtCU,mBAAmB;IAD/B,IAAA,mBAAU,EAAC,KAAK,CAAC;qCAIyB,qCAAgB;GAH9C,mBAAmB,CA8C/B"}
@@ -0,0 +1,6 @@
1
+ import { DynamicModule } from '@nestjs/common';
2
+ import { McpServerFeatureOptions } from './mcp-server.types';
3
+ export declare class McpServerModule {
4
+ static forRoot(): DynamicModule;
5
+ static forFeature(options: McpServerFeatureOptions): DynamicModule;
6
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var McpServerModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.McpServerModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const metadata_scanner_1 = require("../metadata-scanner");
13
+ const mcp_server_controller_1 = require("./mcp-server.controller");
14
+ const mcp_metadata_registry_service_1 = require("./mcp-metadata-registry.service");
15
+ const mcp_server_service_1 = require("./mcp-server.service");
16
+ let McpServerModule = McpServerModule_1 = class McpServerModule {
17
+ static forRoot() {
18
+ return {
19
+ global: true,
20
+ module: McpServerModule_1,
21
+ imports: [metadata_scanner_1.MetadataScannerModule],
22
+ controllers: [mcp_server_controller_1.McpServerController],
23
+ providers: [mcp_metadata_registry_service_1.McpMetadataRegistryService, mcp_server_service_1.McpServerService],
24
+ exports: [],
25
+ };
26
+ }
27
+ static forFeature(options) {
28
+ return {
29
+ module: McpServerModule_1,
30
+ imports: [...(options.imports || [])],
31
+ providers: [...options.executors],
32
+ exports: [...options.executors],
33
+ };
34
+ }
35
+ };
36
+ exports.McpServerModule = McpServerModule;
37
+ exports.McpServerModule = McpServerModule = McpServerModule_1 = __decorate([
38
+ (0, common_1.Module)({})
39
+ ], McpServerModule);
40
+ //# sourceMappingURL=mcp-server.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.module.js","sourceRoot":"","sources":["../../../lib/mcp-server/mcp-server.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuD;AACvD,0DAA4D;AAE5D,mEAA8D;AAC9D,mFAA6E;AAC7E,6DAAwD;AAGjD,IAAM,eAAe,uBAArB,MAAM,eAAe;IACnB,MAAM,CAAC,OAAO;QACnB,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,CAAC,wCAAqB,CAAC;YAChC,WAAW,EAAE,CAAC,2CAAmB,CAAC;YAClC,SAAS,EAAE,CAAC,0DAA0B,EAAE,qCAAgB,CAAC;YACzD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,OAAgC;QACvD,OAAO;YACL,MAAM,EAAE,iBAAe;YACvB,OAAO,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YACrC,SAAS,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;YACjC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;SAChC,CAAC;IACJ,CAAC;CACF,CAAA;AApBY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,eAAe,CAoB3B"}
@@ -0,0 +1,18 @@
1
+ import { JsonRpcErrorResult, JsonRpcRequest, JsonRpcResult } from './mcp-server.types';
2
+ import { McpMetadataRegistryService } from './mcp-metadata-registry.service';
3
+ type HandlerResult<T = unknown> = {
4
+ result: JsonRpcResult<T> | JsonRpcErrorResult;
5
+ } | null;
6
+ export declare class McpServerService {
7
+ private readonly registry;
8
+ private readonly methodHandlers;
9
+ constructor(registry: McpMetadataRegistryService);
10
+ handleMessage(message: JsonRpcRequest): Promise<HandlerResult>;
11
+ private initialize;
12
+ private toolsList;
13
+ private toolCall;
14
+ private resourceList;
15
+ private resourceRead;
16
+ private wrapResult;
17
+ }
18
+ export {};
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpServerService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const mcp_metadata_registry_service_1 = require("./mcp-metadata-registry.service");
15
+ let McpServerService = class McpServerService {
16
+ registry;
17
+ methodHandlers = new Map([
18
+ ['initialize', this.initialize.bind(this)],
19
+ ['tools/list', this.toolsList.bind(this)],
20
+ ['tools/call', this.toolCall.bind(this)],
21
+ ['resources/list', this.resourceList.bind(this)],
22
+ ['resources/read', this.resourceRead.bind(this)],
23
+ ]);
24
+ constructor(registry) {
25
+ this.registry = registry;
26
+ }
27
+ async handleMessage(message) {
28
+ const { method, id } = message;
29
+ try {
30
+ const methodHandler = this.methodHandlers.get(method);
31
+ if (!methodHandler) {
32
+ return null;
33
+ }
34
+ return methodHandler(message);
35
+ }
36
+ catch (error) {
37
+ return {
38
+ result: {
39
+ jsonrpc: '2.0',
40
+ id,
41
+ error: {
42
+ code: -32603,
43
+ message: error.message,
44
+ },
45
+ },
46
+ };
47
+ }
48
+ }
49
+ initialize({ id }) {
50
+ return this.wrapResult(id, {
51
+ protocolVersion: '2024-11-05',
52
+ capabilities: {
53
+ tools: { listChanged: true },
54
+ resources: { subscribe: true, listChanged: true },
55
+ },
56
+ serverInfo: {
57
+ name: 'nestjs-mcp-server',
58
+ version: '1.0.0',
59
+ },
60
+ });
61
+ }
62
+ toolsList({ id }) {
63
+ return this.wrapResult(id, {
64
+ tools: this.registry.getTools().map((t) => ({
65
+ name: t.name,
66
+ description: t.description,
67
+ inputSchema: t.inputSchema || { type: 'object' },
68
+ })),
69
+ });
70
+ }
71
+ async toolCall(message) {
72
+ const { id, params } = message;
73
+ const executor = this.registry.getToolExecutor(params.name);
74
+ if (!executor) {
75
+ throw new Error(`Tool not found: ${params.name}`);
76
+ }
77
+ const executionResult = await executor.execute(message);
78
+ return this.wrapResult(id, {
79
+ content: [
80
+ {
81
+ type: 'text',
82
+ text: JSON.stringify(executionResult),
83
+ },
84
+ ],
85
+ isError: false,
86
+ });
87
+ }
88
+ resourceList({ id }) {
89
+ return this.wrapResult(id, {
90
+ resources: this.registry.getResources(),
91
+ });
92
+ }
93
+ async resourceRead(message) {
94
+ const { id, params } = message;
95
+ const uri = params.uri;
96
+ const matchResult = this.registry.getResourceHandler(uri);
97
+ if (!matchResult) {
98
+ throw new Error(`Resource not found: ${uri}`);
99
+ }
100
+ const { handler, params: uriParams } = matchResult;
101
+ const transformedRequest = {
102
+ ...message,
103
+ params: {
104
+ arguments: uriParams,
105
+ },
106
+ };
107
+ const executionResult = await handler(transformedRequest);
108
+ return this.wrapResult(id, {
109
+ contents: [
110
+ {
111
+ uri,
112
+ mimeType: 'application/json',
113
+ text: JSON.stringify(executionResult),
114
+ },
115
+ ],
116
+ });
117
+ }
118
+ wrapResult(id, result) {
119
+ return {
120
+ result: {
121
+ jsonrpc: '2.0',
122
+ id,
123
+ result,
124
+ },
125
+ };
126
+ }
127
+ };
128
+ exports.McpServerService = McpServerService;
129
+ exports.McpServerService = McpServerService = __decorate([
130
+ (0, common_1.Injectable)(),
131
+ __metadata("design:paramtypes", [mcp_metadata_registry_service_1.McpMetadataRegistryService])
132
+ ], McpServerService);
133
+ //# sourceMappingURL=mcp-server.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.service.js","sourceRoot":"","sources":["../../../lib/mcp-server/mcp-server.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { ModuleMetadata, Provider } from '@nestjs/common';
2
+ import { BaseExecutor } from './base.executor';
3
+ export interface McpServerFeatureOptions extends Pick<ModuleMetadata, 'imports'> {
4
+ executors: Provider<BaseExecutor>[];
5
+ }
6
+ export interface McpServerConfig {
7
+ name: string;
8
+ version: string;
9
+ description?: string;
10
+ }
11
+ export interface CommonJsonRpc {
12
+ jsonrpc: '2.0';
13
+ id?: number | string;
14
+ }
15
+ export interface JsonRpcRequest<T = any> extends CommonJsonRpc {
16
+ method: string;
17
+ params: T;
18
+ }
19
+ export type JsonRpcCallRequest<T = unknown> = JsonRpcRequest<{
20
+ name: string;
21
+ arguments: T;
22
+ }>;
23
+ export interface JsonRpcResult<T = unknown> extends CommonJsonRpc {
24
+ result: T;
25
+ }
26
+ export interface JsonRpcErrorResult<T = unknown> extends CommonJsonRpc {
27
+ error: T;
28
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mcp-server.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.types.js","sourceRoot":"","sources":["../../../lib/mcp-server/mcp-server.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from './metadata-scanner.types';
2
+ export * from './metadata-scanner.service';
3
+ export * from './metadata-scanner.module';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./metadata-scanner.types"), exports);
18
+ __exportStar(require("./metadata-scanner.service"), exports);
19
+ __exportStar(require("./metadata-scanner.module"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/metadata-scanner/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,6DAA2C;AAC3C,4DAA0C"}
@@ -0,0 +1,2 @@
1
+ export declare class MetadataScannerModule {
2
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MetadataScannerModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const metadata_scanner_service_1 = require("./metadata-scanner.service");
12
+ const core_1 = require("@nestjs/core");
13
+ let MetadataScannerModule = class MetadataScannerModule {
14
+ };
15
+ exports.MetadataScannerModule = MetadataScannerModule;
16
+ exports.MetadataScannerModule = MetadataScannerModule = __decorate([
17
+ (0, common_1.Module)({
18
+ imports: [core_1.DiscoveryModule],
19
+ providers: [metadata_scanner_service_1.MetadataScannerService],
20
+ exports: [metadata_scanner_service_1.MetadataScannerService],
21
+ })
22
+ ], MetadataScannerModule);
23
+ //# sourceMappingURL=metadata-scanner.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-scanner.module.js","sourceRoot":"","sources":["../../../lib/metadata-scanner/metadata-scanner.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,yEAAoE;AACpE,uCAA+C;AAOxC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAAG,CAAA;AAAxB,sDAAqB;gCAArB,qBAAqB;IALjC,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,sBAAe,CAAC;QAC1B,SAAS,EAAE,CAAC,iDAAsB,CAAC;QACnC,OAAO,EAAE,CAAC,iDAAsB,CAAC;KAClC,CAAC;GACW,qBAAqB,CAAG"}
@@ -0,0 +1,9 @@
1
+ import { DiscoveryService, Reflector } from '@nestjs/core';
2
+ import { MetadataScannerConfig, ScannedMetadata } from './metadata-scanner.types';
3
+ export declare class MetadataScannerService {
4
+ private readonly reflector;
5
+ private readonly discovery;
6
+ constructor(reflector: Reflector, discovery: DiscoveryService);
7
+ scan(config: MetadataScannerConfig): ScannedMetadata[];
8
+ private getMethodNames;
9
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MetadataScannerService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ let MetadataScannerService = class MetadataScannerService {
16
+ reflector;
17
+ discovery;
18
+ constructor(reflector, discovery) {
19
+ this.reflector = reflector;
20
+ this.discovery = discovery;
21
+ }
22
+ scan(config) {
23
+ const results = [];
24
+ const controllers = this.discovery.getControllers();
25
+ const providers = this.discovery.getProviders();
26
+ const wrappers = [...controllers, ...providers];
27
+ wrappers.forEach(({ instance }) => {
28
+ if (!instance || typeof instance !== 'object') {
29
+ return;
30
+ }
31
+ const prototype = Object.getPrototypeOf(instance);
32
+ if (!prototype) {
33
+ return;
34
+ }
35
+ const methodNames = this.getMethodNames(prototype);
36
+ methodNames.forEach((methodName) => {
37
+ const metadata = this.reflector.get(config.metadataKey, instance[methodName]);
38
+ if (!metadata) {
39
+ return;
40
+ }
41
+ const result = {
42
+ instance,
43
+ methodName,
44
+ metadata,
45
+ };
46
+ results.push(result);
47
+ });
48
+ });
49
+ return results;
50
+ }
51
+ getMethodNames(prototype) {
52
+ return Object.getOwnPropertyNames(prototype).filter((methodName) => {
53
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, methodName);
54
+ return (descriptor &&
55
+ typeof descriptor.value === 'function' &&
56
+ methodName !== 'constructor');
57
+ });
58
+ }
59
+ };
60
+ exports.MetadataScannerService = MetadataScannerService;
61
+ exports.MetadataScannerService = MetadataScannerService = __decorate([
62
+ (0, common_1.Injectable)(),
63
+ __metadata("design:paramtypes", [core_1.Reflector,
64
+ core_1.DiscoveryService])
65
+ ], MetadataScannerService);
66
+ //# sourceMappingURL=metadata-scanner.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-scanner.service.js","sourceRoot":"","sources":["../../../lib/metadata-scanner/metadata-scanner.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,uCAA2D;AAOpD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAEd;IACA;IAFnB,YACmB,SAAoB,EACpB,SAA2B;QAD3B,cAAS,GAAT,SAAS,CAAW;QACpB,cAAS,GAAT,SAAS,CAAkB;IAC3C,CAAC;IAKJ,IAAI,CAAC,MAA6B;QAChC,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAEhD,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC,CAAC;QAChD,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YAChC,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACnD,WAAW,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;gBACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACjC,MAAM,CAAC,WAAW,EAClB,QAAQ,CAAC,UAAU,CAAC,CACrB,CAAC;gBACF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,OAAO;gBACT,CAAC;gBAED,MAAM,MAAM,GAAoB;oBAC9B,QAAQ;oBACR,UAAU;oBACV,QAAQ;iBACT,CAAC;gBAEF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAKO,cAAc,CAAC,SAAc;QACnC,OAAO,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE;YACjE,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAE1E,OAAO,CACL,UAAU;gBACV,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;gBACtC,UAAU,KAAK,aAAa,CAC7B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AA9DY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;qCAGmB,gBAAS;QACT,uBAAgB;GAHnC,sBAAsB,CA8DlC"}
@@ -0,0 +1,8 @@
1
+ export interface ScannedMetadata {
2
+ instance: any;
3
+ methodName: string;
4
+ metadata: any;
5
+ }
6
+ export interface MetadataScannerConfig {
7
+ metadataKey: string | symbol;
8
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=metadata-scanner.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata-scanner.types.js","sourceRoot":"","sources":["../../../lib/metadata-scanner/metadata-scanner.types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "@jissp/nestjs-mcp-server",
3
+ "version": "0.0.1",
4
+ "description": "NestJS-based MCP Server with metadata scanning support",
5
+ "author": "jissp <jisspant@gmail.com>",
6
+ "private": false,
7
+ "license": "MIT",
8
+ "main": "./dist/lib/index.js",
9
+ "types": "./dist/lib/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/lib/index.d.ts",
13
+ "import": "./dist/lib/index.js",
14
+ "require": "./dist/lib/index.js"
15
+ },
16
+ "./mcp-server": {
17
+ "types": "./dist/lib/mcp-server/index.d.ts",
18
+ "import": "./dist/lib/mcp-server/index.js",
19
+ "require": "./dist/lib/mcp-server/index.js"
20
+ },
21
+ "./metadata-scanner": {
22
+ "types": "./dist/lib/metadata-scanner/index.d.ts",
23
+ "import": "./dist/lib/metadata-scanner/index.js",
24
+ "require": "./dist/lib/metadata-scanner/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist/lib",
29
+ "README.md"
30
+ ],
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/jissp/jissp-mcp-server.git"
34
+ },
35
+ "homepage": "https://github.com/jissp/jissp-mcp-server#readme",
36
+ "keywords": [
37
+ "mcp",
38
+ "model-context-protocol",
39
+ "nestjs",
40
+ "metadata"
41
+ ],
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.build.json --outDir dist/lib --rootDir lib",
44
+ "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
45
+ "start": "nest start",
46
+ "test": "jest"
47
+ },
48
+ "peerDependencies": {
49
+ "@nestjs/common": "^11.0.1",
50
+ "@nestjs/core": "^11.0.1",
51
+ "@nestjs/platform-express": "^11.0.1",
52
+ "reflect-metadata": "^0.2.2",
53
+ "rxjs": "^7.8.1"
54
+ },
55
+ "devDependencies": {
56
+ "@eslint/eslintrc": "^3.2.0",
57
+ "@eslint/js": "^9.18.0",
58
+ "@nestjs/cli": "^11.0.0",
59
+ "@nestjs/schematics": "^11.0.0",
60
+ "@nestjs/testing": "^11.0.1",
61
+ "@types/express": "^5.0.0",
62
+ "@types/jest": "^30.0.0",
63
+ "@types/node": "^22.10.7",
64
+ "@types/supertest": "^6.0.2",
65
+ "eslint": "^9.18.0",
66
+ "eslint-config-prettier": "^10.0.1",
67
+ "eslint-plugin-prettier": "^5.2.2",
68
+ "globals": "^16.0.0",
69
+ "jest": "^30.0.0",
70
+ "prettier": "^3.4.2",
71
+ "source-map-support": "^0.5.21",
72
+ "supertest": "^7.0.0",
73
+ "ts-jest": "^29.2.5",
74
+ "ts-loader": "^9.5.2",
75
+ "ts-node": "^10.9.2",
76
+ "tsconfig-paths": "^4.2.0",
77
+ "typescript": "^5.7.3",
78
+ "typescript-eslint": "^8.20.0"
79
+ },
80
+ "jest": {
81
+ "moduleFileExtensions": [
82
+ "js",
83
+ "json",
84
+ "ts"
85
+ ],
86
+ "rootDir": "src",
87
+ "testRegex": ".*\\.spec\\.ts$",
88
+ "transform": {
89
+ "^.+\\.(t|j)s$": "ts-jest"
90
+ },
91
+ "collectCoverageFrom": [
92
+ "**/*.(t|j)s"
93
+ ],
94
+ "coverageDirectory": "../coverage",
95
+ "testEnvironment": "node"
96
+ }
97
+ }