@nestjs-mcp/server 0.1.0 → 0.1.2-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +4 -2
  2. package/dist/controllers/sse/sse.controller.d.ts +3 -1
  3. package/dist/controllers/sse/sse.controller.js +8 -2
  4. package/dist/controllers/sse/sse.controller.js.map +1 -1
  5. package/dist/controllers/sse/sse.service.d.ts +3 -2
  6. package/dist/controllers/sse/sse.service.js +21 -6
  7. package/dist/controllers/sse/sse.service.js.map +1 -1
  8. package/dist/controllers/streamable/streamable.service.d.ts +6 -11
  9. package/dist/controllers/streamable/streamable.service.js +36 -11
  10. package/dist/controllers/streamable/streamable.service.js.map +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/interfaces/capabilities.interface.d.ts +30 -2
  15. package/dist/interfaces/capabilities.interface.js +51 -0
  16. package/dist/interfaces/capabilities.interface.js.map +1 -1
  17. package/dist/interfaces/context.interface.d.ts +6 -0
  18. package/dist/interfaces/context.interface.js +3 -0
  19. package/dist/interfaces/context.interface.js.map +1 -0
  20. package/dist/interfaces/index.d.ts +1 -1
  21. package/dist/interfaces/index.js +1 -1
  22. package/dist/interfaces/index.js.map +1 -1
  23. package/dist/interfaces/mcp-server-options.interface.d.ts +2 -2
  24. package/dist/interfaces/message.types.d.ts +8 -0
  25. package/dist/interfaces/{guards.interface.js → message.types.js} +1 -1
  26. package/dist/interfaces/message.types.js.map +1 -0
  27. package/dist/mcp.module.js +13 -1
  28. package/dist/mcp.module.js.map +1 -1
  29. package/dist/registry/registry.service.d.ts +7 -1
  30. package/dist/registry/registry.service.js +65 -4
  31. package/dist/registry/registry.service.js.map +1 -1
  32. package/dist/services/index.d.ts +1 -0
  33. package/dist/services/index.js +18 -0
  34. package/dist/services/index.js.map +1 -0
  35. package/dist/services/session.manager.d.ts +14 -0
  36. package/dist/services/session.manager.js +27 -0
  37. package/dist/services/session.manager.js.map +1 -0
  38. package/dist/tsconfig.build.tsbuildinfo +1 -1
  39. package/package.json +26 -17
  40. package/.copilotignore +0 -38
  41. package/.devcontainer/Dockerfile.dev +0 -28
  42. package/.devcontainer/devcontainer.json +0 -56
  43. package/.devcontainer/docker-compose.yml +0 -15
  44. package/.dockerignore +0 -37
  45. package/.prettierrc +0 -4
  46. package/coverage/clover.xml +0 -507
  47. package/coverage/coverage-final.json +0 -19
  48. package/coverage/lcov-report/base.css +0 -224
  49. package/coverage/lcov-report/block-navigation.js +0 -87
  50. package/coverage/lcov-report/favicon.png +0 -0
  51. package/coverage/lcov-report/index.html +0 -206
  52. package/coverage/lcov-report/prettify.css +0 -1
  53. package/coverage/lcov-report/prettify.js +0 -2
  54. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  55. package/coverage/lcov-report/sorter.js +0 -196
  56. package/coverage/lcov-report/src/controllers/sse/index.html +0 -146
  57. package/coverage/lcov-report/src/controllers/sse/index.ts.html +0 -91
  58. package/coverage/lcov-report/src/controllers/sse/sse.controller.ts.html +0 -160
  59. package/coverage/lcov-report/src/controllers/sse/sse.service.ts.html +0 -403
  60. package/coverage/lcov-report/src/controllers/streamable/index.html +0 -146
  61. package/coverage/lcov-report/src/controllers/streamable/index.ts.html +0 -91
  62. package/coverage/lcov-report/src/controllers/streamable/streamable.controller.ts.html +0 -157
  63. package/coverage/lcov-report/src/controllers/streamable/streamable.service.ts.html +0 -655
  64. package/coverage/lcov-report/src/decorators/capabilities.constants.ts.html +0 -106
  65. package/coverage/lcov-report/src/decorators/capabilities.decorators.ts.html +0 -535
  66. package/coverage/lcov-report/src/decorators/index.html +0 -146
  67. package/coverage/lcov-report/src/decorators/index.ts.html +0 -91
  68. package/coverage/lcov-report/src/index.html +0 -131
  69. package/coverage/lcov-report/src/index.ts.html +0 -118
  70. package/coverage/lcov-report/src/interfaces/capabilities.interface.ts.html +0 -703
  71. package/coverage/lcov-report/src/interfaces/index.html +0 -131
  72. package/coverage/lcov-report/src/interfaces/index.ts.html +0 -91
  73. package/coverage/lcov-report/src/mcp.module.ts.html +0 -817
  74. package/coverage/lcov-report/src/registry/discovery.service.ts.html +0 -433
  75. package/coverage/lcov-report/src/registry/index.html +0 -161
  76. package/coverage/lcov-report/src/registry/index.ts.html +0 -91
  77. package/coverage/lcov-report/src/registry/logger.service.ts.html +0 -514
  78. package/coverage/lcov-report/src/registry/registry.service.ts.html +0 -1183
  79. package/coverage/lcov-report/src/services/index.html +0 -116
  80. package/coverage/lcov-report/src/services/session.manager.ts.html +0 -163
  81. package/coverage/lcov.info +0 -912
  82. package/dist/interfaces/guards.interface.d.ts +0 -4
  83. package/dist/interfaces/guards.interface.js.map +0 -1
  84. package/eslint.config.mjs +0 -40
  85. package/src/controllers/sse/index.ts +0 -2
  86. package/src/controllers/sse/sse.controller.ts +0 -25
  87. package/src/controllers/sse/sse.service.ts +0 -106
  88. package/src/controllers/streamable/index.ts +0 -2
  89. package/src/controllers/streamable/streamable.controller.ts +0 -24
  90. package/src/controllers/streamable/streamable.service.ts +0 -190
  91. package/src/decorators/capabilities.constants.ts +0 -7
  92. package/src/decorators/capabilities.decorators.ts +0 -150
  93. package/src/decorators/index.ts +0 -2
  94. package/src/index.ts +0 -11
  95. package/src/interfaces/capabilities.interface.ts +0 -206
  96. package/src/interfaces/context.interface.ts +0 -33
  97. package/src/interfaces/index.ts +0 -2
  98. package/src/interfaces/mcp-server-options.interface.ts +0 -105
  99. package/src/interfaces/message.types.ts +0 -13
  100. package/src/mcp.module.ts +0 -244
  101. package/src/mcp.service.spec.ts +0 -28
  102. package/src/registry/discovery.service.ts +0 -116
  103. package/src/registry/index.ts +0 -2
  104. package/src/registry/logger.service.ts +0 -143
  105. package/src/registry/registry.service.ts +0 -366
  106. package/src/services/session.manager.ts +0 -26
@@ -1,4 +0,0 @@
1
- import { ExecutionContext } from '@nestjs/common';
2
- export interface McpExecutionContext extends ExecutionContext {
3
- args: unknown[];
4
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"guards.interface.js","sourceRoot":"","sources":["../../src/interfaces/guards.interface.ts"],"names":[],"mappings":""}
package/eslint.config.mjs DELETED
@@ -1,40 +0,0 @@
1
- // @ts-check
2
- import eslint from '@eslint/js';
3
- import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
4
- import globals from 'globals';
5
- import tseslint from 'typescript-eslint';
6
-
7
- export default tseslint.config(
8
- {
9
- ignores: ['eslint.config.mjs', 'scripts'],
10
- },
11
- eslint.configs.recommended,
12
- ...tseslint.configs.recommendedTypeChecked,
13
- eslintPluginPrettierRecommended,
14
- {
15
- languageOptions: {
16
- globals: {
17
- ...globals.node,
18
- ...globals.jest,
19
- },
20
- ecmaVersion: 5,
21
- sourceType: 'module',
22
- parserOptions: {
23
- projectService: true,
24
- tsconfigRootDir: import.meta.dirname,
25
- },
26
- },
27
- },
28
- {
29
- rules: {
30
- // Allow unused variables/arguments if they start with '_'
31
- '@typescript-eslint/no-unused-vars': [
32
- 'error',
33
- { argsIgnorePattern: '^_' }
34
- ],
35
- '@typescript-eslint/no-explicit-any': 'off',
36
- '@typescript-eslint/no-floating-promises': 'warn',
37
- '@typescript-eslint/no-unsafe-argument': 'warn'
38
- },
39
- },
40
- );
@@ -1,2 +0,0 @@
1
- export * from './sse.controller';
2
- export * from './sse.service';
@@ -1,25 +0,0 @@
1
- import { Controller, Get, Post, Req, Res } from '@nestjs/common';
2
- import { Request, Response } from 'express';
3
-
4
- import { McpLoggerService } from '../../registry/logger.service';
5
- import { SseService } from './sse.service';
6
-
7
- @Controller()
8
- export class SseController {
9
- constructor(
10
- private readonly logger: McpLoggerService,
11
- private readonly service: SseService,
12
- ) {}
13
-
14
- @Get('sse')
15
- async handleSse(@Req() req: Request, @Res() res: Response) {
16
- this.logger.log('[SSE] Connection established');
17
- await this.service.handleSse(req, res);
18
- }
19
-
20
- @Post('messages')
21
- async handleMessages(@Req() req: Request, @Res() res: Response) {
22
- this.logger.log('[SSE] Message received');
23
- await this.service.handleMessage(req, res);
24
- }
25
- }
@@ -1,106 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
3
- import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
4
- import { Request, Response } from 'express';
5
-
6
- import { McpServerOptions } from '../../interfaces/mcp-server-options.interface';
7
- import { McpLoggerService } from '../../registry/logger.service';
8
- import { RegistryService } from '../../registry/registry.service';
9
- import { SessionManager } from '../../services/session.manager';
10
-
11
- @Injectable()
12
- export class SseService implements OnModuleInit {
13
- private server: McpServer;
14
-
15
- constructor(
16
- @Inject('MCP_SERVER_OPTIONS')
17
- private readonly options: McpServerOptions,
18
- private readonly registry: RegistryService,
19
- private readonly logger: McpLoggerService,
20
- private readonly sessionManager: SessionManager,
21
- ) {
22
- this.server = new McpServer(this.options.serverInfo, this.options.options);
23
- }
24
-
25
- async onModuleInit() {
26
- this.logger.log('Starting MCP controller registration', 'MCP_SERVER');
27
- await this.registry.registerAll(this.server);
28
- this.logger.log('MCP initialization completed', 'MCP_SERVER');
29
- }
30
-
31
- /**
32
- * Handle an SSE request for server-sent events
33
- *
34
- * This establishes a connection for server-to-client notifications
35
- */
36
- async handleSse(req: Request, res: Response) {
37
- // Create SSE transport for legacy clients
38
- const transport = new SSEServerTransport('/messages', res);
39
-
40
- this.sessionManager.setSession(transport.sessionId, {
41
- transport,
42
- request: req,
43
- });
44
-
45
- this.logger.debug(
46
- `Starting SSE for sessionId: ${transport.sessionId}`,
47
- 'api',
48
- );
49
-
50
- res.on('close', () => {
51
- this.sessionManager.deleteSession(transport.sessionId);
52
- });
53
-
54
- await this.server.connect(transport);
55
- }
56
-
57
- /**
58
- * Handle SSE messages sent from client to server
59
- */
60
- async handleMessage(req: Request, res: Response) {
61
- const sessionId = req.query.sessionId as string;
62
- const session = this.sessionManager.getSession(sessionId);
63
-
64
- if (!session) {
65
- res.status(400).send('Invalid or missing sessionId');
66
- return;
67
- }
68
-
69
- this.logger.debug(
70
- `Receiving SSE message for sessionId: ${sessionId}`,
71
- 'api',
72
- );
73
-
74
- this.logger.debug(`SSE message: ${JSON.stringify(req.body)}`, 'MCP_SERVER');
75
-
76
- const transport = session.transport;
77
-
78
- if (!(transport instanceof SSEServerTransport)) {
79
- res.status(400).send('Invalid transport');
80
- return;
81
- }
82
-
83
- try {
84
- if (transport) {
85
- await transport.handlePostMessage(req, res, req.body);
86
- } else {
87
- res.status(400).send('No transport found for sessionId');
88
- }
89
- } catch (error) {
90
- const errorMessage =
91
- error instanceof Error ? error.message : 'Unknown error';
92
-
93
- this.logger.error(
94
- 'Error al manejar mensaje SSE',
95
- errorMessage,
96
- 'MCP_SERVER',
97
- );
98
-
99
- res.status(500).send({
100
- statusCode: 500,
101
- error: 'Internal Server Error',
102
- message: errorMessage,
103
- });
104
- }
105
- }
106
- }
@@ -1,2 +0,0 @@
1
- export * from './streamable.controller';
2
- export * from './streamable.service';
@@ -1,24 +0,0 @@
1
- import { Controller, Delete, Get, Post, Req, Res } from '@nestjs/common';
2
- import { Request, Response } from 'express';
3
-
4
- import { StreamableService } from './streamable.service';
5
-
6
- @Controller()
7
- export class StreamableController {
8
- constructor(private readonly service: StreamableService) {}
9
-
10
- @Post('mcp')
11
- async handleMcpPost(@Req() req: Request, @Res() res: Response) {
12
- await this.service.handlePostRequest(req, res);
13
- }
14
-
15
- @Get('mcp')
16
- async handleMcpGet(@Req() req: Request, @Res() res: Response) {
17
- await this.service.handleGetRequest(req, res);
18
- }
19
-
20
- @Delete('mcp')
21
- async handleMcpDelete(@Req() req: Request, @Res() res: Response) {
22
- await this.service.handleDeleteRequest(req, res);
23
- }
24
- }
@@ -1,190 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
3
- import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
4
- import { Inject, Injectable, OnModuleInit } from '@nestjs/common';
5
- import { randomUUID } from 'crypto';
6
- import { Request, Response } from 'express';
7
-
8
- import {
9
- McpModuleTransportOptions,
10
- McpServerOptions,
11
- } from '../../interfaces/mcp-server-options.interface';
12
- import { McpLoggerService } from '../../registry/logger.service';
13
- import { RegistryService } from '../../registry/registry.service';
14
- import { SessionManager } from '../../services/session.manager';
15
- // TODO: Stateless mode should be handled here or in another service
16
-
17
- @Injectable()
18
- export class StreamableService implements OnModuleInit {
19
- private server: McpServer;
20
-
21
- constructor(
22
- @Inject('MCP_SERVER_OPTIONS')
23
- private readonly options: McpServerOptions,
24
- @Inject('MCP_TRANSPORT_OPTIONS')
25
- private readonly transportOptions: McpModuleTransportOptions,
26
- private readonly registry: RegistryService,
27
- private readonly logger: McpLoggerService,
28
- private readonly sessionManager: SessionManager,
29
- ) {
30
- this.server = new McpServer(this.options.serverInfo, this.options.options);
31
- }
32
-
33
- async onModuleInit() {
34
- await this.registry.registerAll(this.server);
35
-
36
- this.logger.log('MCP STREAMEABLE initialization completed');
37
- }
38
-
39
- /**
40
- * Handle a streamable HTTP POST request from a client
41
- *
42
- * - Uses sessionId from query or generates a new one if missing
43
- * - Stores the transport by sessionId for later retrieval
44
- * - Cleans up transport on connection close
45
- *
46
- * @param req Express Request object (expects sessionId in query)
47
- * @param res Express Response object
48
- */
49
- async handlePostRequest(req: Request, res: Response) {
50
- const sessionId = req.headers['mcp-session-id'] as string | undefined;
51
- let transport: StreamableHTTPServerTransport;
52
-
53
- const { options } = this.transportOptions?.streamable || {};
54
-
55
- if (sessionId && this.sessionManager.getSession(sessionId)) {
56
- const session = this.sessionManager.getSession(sessionId);
57
-
58
- if (!session) {
59
- throw new Error('Session not found');
60
- }
61
-
62
- if (!(session.transport instanceof StreamableHTTPServerTransport)) {
63
- throw new Error('Invalid transport');
64
- }
65
-
66
- transport = session.transport;
67
- } else if (!sessionId && isInitializeRequest(req.body)) {
68
- // This is called only when method is initialize
69
- transport = new StreamableHTTPServerTransport({
70
- sessionIdGenerator: () =>
71
- options?.sessionIdGenerator?.() || randomUUID(),
72
- onsessioninitialized: (sessionId) => {
73
- this.sessionManager.setSession(sessionId, {
74
- transport,
75
- request: req,
76
- });
77
- },
78
- enableJsonResponse: options?.enableJsonResponse,
79
- eventStore: options?.eventStore,
80
- });
81
-
82
- transport.onclose = () => {
83
- if (transport.sessionId) {
84
- this.sessionManager.deleteSession(transport.sessionId);
85
- }
86
- };
87
-
88
- await this.server.connect(transport);
89
- } else {
90
- // Invalid request
91
- res.status(400).json({
92
- jsonrpc: '2.0',
93
- error: {
94
- code: -32000,
95
- message: 'Bad Request: No valid session ID provided',
96
- },
97
- id: null,
98
- });
99
-
100
- return;
101
- }
102
-
103
- await transport.handleRequest(req, res, req.body);
104
- }
105
-
106
- /**
107
- * Handle a streamable HTTP GET request from a client
108
- *
109
- * This method retrieves the existing streamable transport for the session and delegates the request.
110
- *
111
- * @param req Express Request object (expects sessionId in query)
112
- * @param res Express Response object
113
- */
114
- async handleGetRequest(req: Request, res: Response) {
115
- const sessionId = req.headers['mcp-session-id'] as string | undefined;
116
-
117
- if (!sessionId || !this.sessionManager.getSession(sessionId)) {
118
- res.status(400).send('Invalid or missing session ID');
119
- return;
120
- }
121
-
122
- const session = this.sessionManager.getSession(sessionId);
123
-
124
- if (!session) {
125
- throw new Error('Session not found');
126
- }
127
-
128
- const { transport } = session;
129
-
130
- if (!(transport instanceof StreamableHTTPServerTransport)) {
131
- throw new Error('Invalid transport');
132
- }
133
-
134
- await transport.handleRequest(req, res);
135
- }
136
-
137
- /**
138
- * Handle a streamable HTTP DELETE request to clean up a session
139
- *
140
- * - Accepts sessionId from query or x-mcp-session-id header
141
- * - Closes and removes the transport if found
142
- * - Always sends a response
143
- *
144
- * @param req Express Request object
145
- * @param res Express Response object
146
- */
147
- async handleDeleteRequest(req: Request, res: Response) {
148
- const sessionId = req.headers['mcp-session-id'] as string | undefined;
149
-
150
- if (!sessionId) {
151
- res.status(400).json({ error: 'Missing sessionId' });
152
- return;
153
- }
154
-
155
- const session = this.sessionManager.getSession(sessionId);
156
-
157
- if (!session) {
158
- throw new Error('Session not found');
159
- }
160
-
161
- const { transport } = session;
162
-
163
- if (transport) {
164
- this.logger.debug(
165
- `Closing streamable transport for sessionId: ${sessionId}`,
166
- 'STREAMABLE',
167
- );
168
-
169
- await transport.close();
170
-
171
- const uuidV4Regex =
172
- /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
173
-
174
- if (!uuidV4Regex.test(sessionId)) {
175
- res.status(400).json({ error: 'Invalid sessionId format' });
176
- return;
177
- }
178
-
179
- this.sessionManager.deleteSession(sessionId);
180
-
181
- res.status(200).json({ success: true, sessionId });
182
- } else {
183
- this.logger.debug(
184
- `No streamable transport found for sessionId: ${sessionId}`,
185
- 'STREAMABLE',
186
- );
187
- res.status(404).json({ error: 'Transport not found', sessionId });
188
- }
189
- }
190
- }
@@ -1,7 +0,0 @@
1
- // Prefijo para todas las constantes de metadatos
2
- export const PREFIX = 'MCP';
3
-
4
- // Constantes de metadatos para decoradores de método
5
- export const MCP_TOOL = `${PREFIX}:tool`;
6
- export const MCP_PROMPT = `${PREFIX}:prompt`;
7
- export const MCP_RESOURCE = `${PREFIX}:resource`;
@@ -1,150 +0,0 @@
1
- import { Injectable, SetMetadata } from '@nestjs/common';
2
-
3
- import {
4
- PromptOptions,
5
- ResourceOptions,
6
- ToolOptions,
7
- } from '../interfaces/capabilities.interface';
8
- import { MCP_PROMPT, MCP_RESOURCE, MCP_TOOL } from './capabilities.constants';
9
-
10
- /**
11
- * Metadata key to mark a class as an MCP Resolver.
12
- */
13
- export const MCP_RESOLVER = '__mcp_resolver__';
14
-
15
- /**
16
- * Metadata key to attach guards to a Resolver class or method.
17
- */
18
- export const MCP_GUARDS = '__mcp_guards__';
19
-
20
- /**
21
- * Decorator for marking a class as an MCP Resolver.
22
- * Enables dependency injection and workspace grouping for MCP capabilities.
23
- *
24
- * @param workspace Optional workspace/namespace for grouping capabilities
25
- * @example
26
- * @Resolver('my-workspace')
27
- * export class MyResolver { ... }
28
- */
29
- export function Resolver(workspace?: string): ClassDecorator {
30
- return function (target: any) {
31
- Injectable()(target);
32
- SetMetadata(MCP_RESOLVER, workspace || true)(target);
33
- };
34
- }
35
-
36
- /**
37
- * Decorator to attach one or more guards to a Resolver class or method.
38
- * Accepts guard classes or instances implementing CanActivate.
39
- *
40
- * @param guards One or more guard classes or instances
41
- * @example
42
- * @UseGuards(MyGuard)
43
- * @Resolver('workspace')
44
- * export class MyResolver { ... }
45
- */
46
- export function UseGuards(...guards: any[]): ClassDecorator & MethodDecorator {
47
- return SetMetadata(MCP_GUARDS, guards);
48
- }
49
-
50
- /**
51
- * Decorator for marking a method as an MCP Tool.
52
- * Use with @McpProvider.
53
- *
54
- * La herramienta debe devolver un objeto con el formato:
55
- * {
56
- * content: [
57
- * {
58
- * type: 'text', // Puede ser 'text', 'image', 'video', 'audio', etc.
59
- * text: 'Texto de la respuesta',
60
- * }
61
- * ]
62
- * }
63
- *
64
- * @param options Tool configuration
65
- */
66
- export function Tool(options: ToolOptions) {
67
- return function (
68
- target: object,
69
- propertyKey: string,
70
- descriptor: PropertyDescriptor,
71
- ) {
72
- SetMetadata(MCP_TOOL, {
73
- ...options,
74
- methodName: propertyKey,
75
- })(target, propertyKey, descriptor);
76
-
77
- return descriptor;
78
- };
79
- }
80
-
81
- /**
82
- * Decorator for marking a method as an MCP Prompt.
83
- * Use with @McpProvider.
84
- *
85
- * El prompt debe devolver un objeto con el formato:
86
- * {
87
- * messages: [
88
- * {
89
- * role: 'assistant',
90
- * content: {
91
- * type: 'text',
92
- * text: 'Texto del mensaje'
93
- * }
94
- * }
95
- * ]
96
- * }
97
- *
98
- * @param options Prompt configuration
99
- */
100
- export function Prompt(options: PromptOptions) {
101
- return function (
102
- target: object,
103
- propertyKey: string,
104
- descriptor: PropertyDescriptor,
105
- ) {
106
- SetMetadata(MCP_PROMPT, {
107
- ...options,
108
- methodName: propertyKey,
109
- })(target, propertyKey, descriptor);
110
-
111
- return descriptor;
112
- };
113
- }
114
-
115
- /**
116
- * Decorator for marking a method as an MCP Resource provider.
117
- * Use with @McpProvider.
118
- *
119
- * Hay dos modos de uso para los recursos:
120
- *
121
- * 1. Recurso con URI fija:
122
- * @Resource({
123
- * name: 'nombreRecurso',
124
- * uri: 'resource://midominio/recurso'
125
- * })
126
- *
127
- * 2. Recurso con plantilla (para parámetros dinámicos):
128
- * @Resource({
129
- * name: 'nombreRecurso',
130
- * template: 'resource://midominio/recurso/{parametro}'
131
- * })
132
- *
133
- * También se puede proporcionar solo el nombre como string:
134
- * @Resource('nombreRecurso')
135
- *
136
- * @param options Resource configuration or just the name as a string
137
- */
138
- export function Resource(options: ResourceOptions) {
139
- return function (
140
- target: object,
141
- propertyKey: string,
142
- descriptor: PropertyDescriptor,
143
- ) {
144
- SetMetadata(MCP_RESOURCE, {
145
- ...options,
146
- methodName: propertyKey,
147
- })(target, propertyKey, descriptor);
148
- return descriptor;
149
- };
150
- }
@@ -1,2 +0,0 @@
1
- export * from './capabilities.constants';
2
- export * from './capabilities.decorators';
package/src/index.ts DELETED
@@ -1,11 +0,0 @@
1
- // Core components
2
- export * from './mcp.module';
3
-
4
- // Interfaces
5
- export * from './interfaces';
6
-
7
- // Registry components
8
- export * from './registry';
9
-
10
- // Decorators
11
- export * from './decorators';