@mcp-weave/nestjs 0.1.0 → 0.1.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 ADDED
@@ -0,0 +1,246 @@
1
+ # @mcp-weave/nestjs
2
+
3
+ NestJS-style decorators for building Model Context Protocol (MCP) servers with TypeScript.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @mcp-weave/nestjs reflect-metadata
9
+ # or
10
+ pnpm add @mcp-weave/nestjs reflect-metadata
11
+ ```
12
+
13
+ **Important:** Enable decorators in your `tsconfig.json`:
14
+
15
+ ```json
16
+ {
17
+ "compilerOptions": {
18
+ "experimentalDecorators": true,
19
+ "emitDecoratorMetadata": true
20
+ }
21
+ }
22
+ ```
23
+
24
+ ## Features
25
+
26
+ - **Class Decorators** - `@McpServer` to define MCP servers
27
+ - **Method Decorators** - `@McpTool`, `@McpResource`, `@McpPrompt`
28
+ - **Parameter Decorators** - `@McpInput`, `@McpParam`, `@McpPromptArg`
29
+ - **Runtime Server** - Start MCP servers from decorated classes
30
+
31
+ ## Quick Start
32
+
33
+ ```typescript
34
+ import 'reflect-metadata';
35
+ import {
36
+ McpServer,
37
+ McpTool,
38
+ McpResource,
39
+ McpPrompt,
40
+ McpInput,
41
+ McpParam,
42
+ McpPromptArg,
43
+ createMcpServer,
44
+ } from '@mcp-weave/nestjs';
45
+
46
+ @McpServer({
47
+ name: 'my-server',
48
+ version: '1.0.0',
49
+ description: 'My MCP server',
50
+ })
51
+ class MyServer {
52
+ @McpTool({
53
+ name: 'greet',
54
+ description: 'Greets a user',
55
+ inputSchema: {
56
+ type: 'object',
57
+ properties: {
58
+ name: { type: 'string', description: 'Name to greet' },
59
+ },
60
+ required: ['name'],
61
+ },
62
+ })
63
+ greet(@McpInput() input: { name: string }) {
64
+ return `Hello, ${input.name}!`;
65
+ }
66
+
67
+ @McpResource({
68
+ uri: 'config://settings',
69
+ name: 'Settings',
70
+ description: 'Application settings',
71
+ })
72
+ getSettings() {
73
+ return {
74
+ contents: [
75
+ {
76
+ uri: 'config://settings',
77
+ mimeType: 'application/json',
78
+ text: JSON.stringify({ theme: 'dark' }),
79
+ },
80
+ ],
81
+ };
82
+ }
83
+
84
+ @McpPrompt({
85
+ name: 'welcome',
86
+ description: 'Welcome message prompt',
87
+ arguments: [{ name: 'username', description: 'User name', required: true }],
88
+ })
89
+ welcomePrompt(@McpPromptArg('username') username: string) {
90
+ return {
91
+ messages: [
92
+ {
93
+ role: 'user',
94
+ content: { type: 'text', text: `Welcome ${username} to our service!` },
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ }
100
+
101
+ // Start the server
102
+ createMcpServer(MyServer);
103
+ ```
104
+
105
+ ## Decorators
106
+
107
+ ### @McpServer
108
+
109
+ Marks a class as an MCP server.
110
+
111
+ ```typescript
112
+ @McpServer({
113
+ name: 'server-name',
114
+ version: '1.0.0',
115
+ description: 'Optional description',
116
+ })
117
+ class MyServer {}
118
+ ```
119
+
120
+ ### @McpTool
121
+
122
+ Defines an MCP tool (callable function).
123
+
124
+ ```typescript
125
+ @McpTool({
126
+ name: 'tool_name',
127
+ description: 'What the tool does',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ param1: { type: 'string' },
132
+ param2: { type: 'number' },
133
+ },
134
+ required: ['param1'],
135
+ },
136
+ })
137
+ myTool(@McpInput() input: ToolInput) {
138
+ return result;
139
+ }
140
+ ```
141
+
142
+ ### @McpResource
143
+
144
+ Defines an MCP resource (readable data).
145
+
146
+ ```typescript
147
+ @McpResource({
148
+ uri: 'resource://path/{id}',
149
+ name: 'Resource Name',
150
+ description: 'Resource description',
151
+ mimeType: 'application/json',
152
+ })
153
+ getResource(@McpParam('id') id: string) {
154
+ return {
155
+ contents: [{ uri: `resource://path/${id}`, text: 'content' }],
156
+ };
157
+ }
158
+ ```
159
+
160
+ ### @McpPrompt
161
+
162
+ Defines an MCP prompt template.
163
+
164
+ ```typescript
165
+ @McpPrompt({
166
+ name: 'prompt_name',
167
+ description: 'Prompt description',
168
+ arguments: [
169
+ { name: 'arg1', description: 'Argument 1', required: true },
170
+ { name: 'arg2', description: 'Argument 2', required: false },
171
+ ],
172
+ })
173
+ myPrompt(
174
+ @McpPromptArg('arg1') arg1: string,
175
+ @McpPromptArg('arg2') arg2?: string
176
+ ) {
177
+ return {
178
+ messages: [{ role: 'user', content: { type: 'text', text: `...` } }],
179
+ };
180
+ }
181
+ ```
182
+
183
+ ## Parameter Decorators
184
+
185
+ | Decorator | Use Case |
186
+ | --------------------- | ---------------------- |
187
+ | `@McpInput()` | Tool input object |
188
+ | `@McpParam(name)` | Resource URI parameter |
189
+ | `@McpPromptArg(name)` | Prompt argument |
190
+
191
+ ## Runtime Server
192
+
193
+ ### createMcpServer
194
+
195
+ Creates and starts an MCP server from a decorated class.
196
+
197
+ ```typescript
198
+ import { createMcpServer } from '@mcp-weave/nestjs';
199
+
200
+ // Starts server on stdio transport
201
+ await createMcpServer(MyServer);
202
+ ```
203
+
204
+ ### McpRuntimeServer
205
+
206
+ For more control, use the class directly:
207
+
208
+ ```typescript
209
+ import { McpRuntimeServer } from '@mcp-weave/nestjs';
210
+
211
+ const server = new McpRuntimeServer(MyServer, {
212
+ transport: 'stdio',
213
+ });
214
+
215
+ await server.start();
216
+ ```
217
+
218
+ ## Metadata Extraction
219
+
220
+ Extract metadata from decorated classes for code generation:
221
+
222
+ ```typescript
223
+ import { extractMetadata, getServerMetadata, getToolsMetadata } from '@mcp-weave/nestjs';
224
+
225
+ const metadata = extractMetadata(MyServer);
226
+ console.log(metadata.server);
227
+ console.log(metadata.tools);
228
+ console.log(metadata.resources);
229
+ console.log(metadata.prompts);
230
+ ```
231
+
232
+ ## Requirements
233
+
234
+ - Node.js >= 18
235
+ - TypeScript >= 5.0
236
+ - `reflect-metadata` package
237
+
238
+ ## Related Packages
239
+
240
+ - [`@mcp-weave/core`](https://www.npmjs.com/package/@mcp-weave/core) - Core types and utilities
241
+ - [`@mcp-weave/testing`](https://www.npmjs.com/package/@mcp-weave/testing) - Testing utilities
242
+ - [`@mcp-weave/cli`](https://www.npmjs.com/package/@mcp-weave/cli) - Command-line interface
243
+
244
+ ## License
245
+
246
+ MIT
package/dist/index.js CHANGED
@@ -125,6 +125,8 @@ function getPromptsMetadata(target) {
125
125
  function getParamsMetadata(target) {
126
126
  return Reflect.getMetadata(core.METADATA_KEYS.PARAMS, target) ?? [];
127
127
  }
128
+
129
+ // src/runtime/server.ts
128
130
  var McpRuntimeServer = class {
129
131
  server;
130
132
  instance;
@@ -158,85 +160,118 @@ var McpRuntimeServer = class {
158
160
  setupToolHandlers() {
159
161
  const tools = this.metadata.tools;
160
162
  if (tools.length === 0) return;
161
- this.server.setRequestHandler({ method: "tools/list" }, async () => ({
162
- tools: tools.map((tool) => ({
163
- name: tool.name,
164
- description: tool.description,
165
- inputSchema: tool.inputSchema ?? { type: "object", properties: {} }
166
- }))
167
- }));
168
- this.server.setRequestHandler({ method: "tools/call" }, async (request) => {
169
- const toolName = request.params.name;
170
- const tool = tools.find((t) => t.name === toolName);
171
- if (!tool) {
172
- throw new Error(`Unknown tool: ${toolName}`);
173
- }
174
- const method = this.instance[tool.propertyKey];
175
- if (typeof method !== "function") {
176
- throw new Error(`Method ${String(tool.propertyKey)} not found`);
163
+ this.server.setRequestHandler(
164
+ { method: "tools/list" },
165
+ async () => ({
166
+ tools: tools.map((tool) => ({
167
+ name: tool.name,
168
+ description: tool.description,
169
+ inputSchema: tool.inputSchema ?? { type: "object", properties: {} }
170
+ }))
171
+ })
172
+ );
173
+ this.server.setRequestHandler(
174
+ { method: "tools/call" },
175
+ async (request) => {
176
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
177
+ const params = request.params;
178
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
179
+ const toolName = params.name;
180
+ const tool = tools.find((t) => t.name === toolName);
181
+ if (!tool) {
182
+ throw new Error(`Unknown tool: ${toolName}`);
183
+ }
184
+ const method = Reflect.get(this.instance, tool.propertyKey);
185
+ if (typeof method !== "function") {
186
+ throw new Error(`Method ${String(tool.propertyKey)} not found`);
187
+ }
188
+ const args = this.resolveToolArgs(
189
+ tool.propertyKey,
190
+ params.arguments ?? {}
191
+ );
192
+ const result = await method.apply(this.instance, args);
193
+ return {
194
+ content: [
195
+ {
196
+ type: "text",
197
+ text: typeof result === "string" ? result : JSON.stringify(result)
198
+ }
199
+ ]
200
+ };
177
201
  }
178
- const args = this.resolveToolArgs(tool.propertyKey, request.params.arguments ?? {});
179
- const result = await method.apply(this.instance, args);
180
- return {
181
- content: [
182
- {
183
- type: "text",
184
- text: typeof result === "string" ? result : JSON.stringify(result)
185
- }
186
- ]
187
- };
188
- });
202
+ );
189
203
  }
190
204
  setupResourceHandlers() {
191
205
  const resources = this.metadata.resources;
192
206
  if (resources.length === 0) return;
193
- this.server.setRequestHandler({ method: "resources/list" }, async () => ({
194
- resources: resources.map((resource) => ({
195
- uri: resource.uri,
196
- name: resource.name,
197
- description: resource.description,
198
- mimeType: resource.mimeType
199
- }))
200
- }));
201
- this.server.setRequestHandler({ method: "resources/read" }, async (request) => {
202
- const uri = request.params.uri;
203
- for (const resource of resources) {
204
- const params = this.extractUriParams(resource.uri, uri);
205
- if (params) {
206
- const method = this.instance[resource.propertyKey];
207
- if (typeof method !== "function") {
208
- throw new Error(`Method ${String(resource.propertyKey)} not found`);
207
+ this.server.setRequestHandler(
208
+ { method: "resources/list" },
209
+ async () => ({
210
+ resources: resources.map((resource) => ({
211
+ uri: resource.uri,
212
+ name: resource.name,
213
+ description: resource.description,
214
+ mimeType: resource.mimeType
215
+ }))
216
+ })
217
+ );
218
+ this.server.setRequestHandler(
219
+ { method: "resources/read" },
220
+ async (request) => {
221
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
222
+ const params = request.params;
223
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
224
+ const uri = params.uri;
225
+ for (const resource of resources) {
226
+ const uriParams = this.extractUriParams(resource.uri, uri);
227
+ if (uriParams) {
228
+ const method = Reflect.get(this.instance, resource.propertyKey);
229
+ if (typeof method !== "function") {
230
+ throw new Error(`Method ${String(resource.propertyKey)} not found`);
231
+ }
232
+ const args = this.resolveResourceArgs(resource.propertyKey, uriParams);
233
+ return await method.apply(this.instance, args);
209
234
  }
210
- const args = this.resolveResourceArgs(resource.propertyKey, params);
211
- return await method.apply(this.instance, args);
212
235
  }
236
+ throw new Error(`Resource not found: ${uri}`);
213
237
  }
214
- throw new Error(`Resource not found: ${uri}`);
215
- });
238
+ );
216
239
  }
217
240
  setupPromptHandlers() {
218
241
  const prompts = this.metadata.prompts;
219
242
  if (prompts.length === 0) return;
220
- this.server.setRequestHandler({ method: "prompts/list" }, async () => ({
221
- prompts: prompts.map((prompt) => ({
222
- name: prompt.name,
223
- description: prompt.description,
224
- arguments: prompt.arguments ?? []
225
- }))
226
- }));
227
- this.server.setRequestHandler({ method: "prompts/get" }, async (request) => {
228
- const promptName = request.params.name;
229
- const prompt = prompts.find((p) => p.name === promptName);
230
- if (!prompt) {
231
- throw new Error(`Unknown prompt: ${promptName}`);
232
- }
233
- const method = this.instance[prompt.propertyKey];
234
- if (typeof method !== "function") {
235
- throw new Error(`Method ${String(prompt.propertyKey)} not found`);
243
+ this.server.setRequestHandler(
244
+ { method: "prompts/list" },
245
+ async () => ({
246
+ prompts: prompts.map((prompt) => ({
247
+ name: prompt.name,
248
+ description: prompt.description,
249
+ arguments: prompt.arguments ?? []
250
+ }))
251
+ })
252
+ );
253
+ this.server.setRequestHandler(
254
+ { method: "prompts/get" },
255
+ async (request) => {
256
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
257
+ const params = request.params;
258
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
259
+ const promptName = params.name;
260
+ const prompt = prompts.find((p) => p.name === promptName);
261
+ if (!prompt) {
262
+ throw new Error(`Unknown prompt: ${promptName}`);
263
+ }
264
+ const method = Reflect.get(this.instance, prompt.propertyKey);
265
+ if (typeof method !== "function") {
266
+ throw new Error(`Method ${String(prompt.propertyKey)} not found`);
267
+ }
268
+ const args = this.resolvePromptArgs(
269
+ prompt.propertyKey,
270
+ params.arguments ?? {}
271
+ );
272
+ return await method.apply(this.instance, args);
236
273
  }
237
- const args = this.resolvePromptArgs(prompt.propertyKey, request.params.arguments ?? {});
238
- return await method.apply(this.instance, args);
239
- });
274
+ );
240
275
  }
241
276
  resolveToolArgs(propertyKey, input) {
242
277
  const params = this.metadata.params.filter(
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decorators/mcp-server.ts","../src/decorators/mcp-tool.ts","../src/decorators/mcp-resource.ts","../src/decorators/mcp-prompt.ts","../src/decorators/params.ts","../src/metadata/storage.ts","../src/runtime/server.ts","../src/index.ts"],"names":["METADATA_KEYS","extractMetadata","Server","StdioServerTransport"],"mappings":"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","file":"index.js","sourcesContent":["import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpServerMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpServer decorator\n */\nexport interface McpServerOptions {\n /**\n * Server name\n */\n name: string;\n\n /**\n * Server version (default: '1.0.0')\n */\n version?: string;\n\n /**\n * Server description\n */\n description?: string;\n}\n\n/**\n * Marks a class as an MCP server\n *\n * @example\n * ```typescript\n * @McpServer({ name: 'my-service', version: '1.0.0' })\n * export class MyController {\n * // ...\n * }\n * ```\n */\nexport function McpServer(options: McpServerOptions): ClassDecorator {\n return (target: Function) => {\n const metadata: McpServerMetadata = {\n name: options.name,\n version: options.version ?? '1.0.0',\n description: options.description,\n target,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.SERVER, metadata, target);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpToolMetadata, ToolInputSchema } from '@mcp-weave/core';\n\n/**\n * Options for @McpTool decorator\n */\nexport interface McpToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool description\n */\n description: string;\n\n /**\n * Input schema (JSON Schema)\n */\n inputSchema?: ToolInputSchema;\n}\n\n/**\n * Marks a method as an MCP tool\n *\n * @example\n * ```typescript\n * @McpTool({\n * name: 'create_user',\n * description: 'Creates a new user'\n * })\n * async createUser(@McpInput() input: CreateUserDto) {\n * return { success: true };\n * }\n * ```\n */\nexport function McpTool(options: McpToolOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingTools: McpToolMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.TOOLS, constructor) ?? [];\n\n const metadata: McpToolMetadata = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.TOOLS, [...existingTools, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpResourceMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpResource decorator\n */\nexport interface McpResourceOptions {\n /**\n * Resource URI template (e.g., 'user://{userId}')\n */\n uri: string;\n\n /**\n * Resource name\n */\n name: string;\n\n /**\n * Resource description\n */\n description?: string;\n\n /**\n * MIME type (default: 'application/json')\n */\n mimeType?: string;\n}\n\n/**\n * Marks a method as an MCP resource\n *\n * @example\n * ```typescript\n * @McpResource({\n * uri: 'user://{userId}',\n * name: 'User Profile',\n * mimeType: 'application/json'\n * })\n * async getUserProfile(@McpParam('userId') userId: string) {\n * return { contents: [...] };\n * }\n * ```\n */\nexport function McpResource(options: McpResourceOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingResources: McpResourceMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.RESOURCES, constructor) ?? [];\n\n const metadata: McpResourceMetadata = {\n uri: options.uri,\n name: options.name,\n description: options.description,\n mimeType: options.mimeType ?? 'application/json',\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.RESOURCES, [...existingResources, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpPromptMetadata, PromptArgument } from '@mcp-weave/core';\n\n/**\n * Options for @McpPrompt decorator\n */\nexport interface McpPromptOptions {\n /**\n * Prompt name\n */\n name: string;\n\n /**\n * Prompt description\n */\n description: string;\n\n /**\n * Prompt arguments\n */\n arguments?: PromptArgument[];\n}\n\n/**\n * Marks a method as an MCP prompt\n *\n * @example\n * ```typescript\n * @McpPrompt({\n * name: 'welcome_email',\n * description: 'Generate welcome email for new user'\n * })\n * async generateWelcomeEmail(\n * @McpPromptArg('userName') userName: string\n * ) {\n * return { messages: [...] };\n * }\n * ```\n */\nexport function McpPrompt(options: McpPromptOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingPrompts: McpPromptMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PROMPTS, constructor) ?? [];\n\n const metadata: McpPromptMetadata = {\n name: options.name,\n description: options.description,\n arguments: options.arguments,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PROMPTS, [...existingPrompts, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpParamMetadata } from '@mcp-weave/core';\n\n/**\n * Injects the tool input\n *\n * @example\n * ```typescript\n * @McpTool({ name: 'create_user', description: 'Creates a user' })\n * async createUser(@McpInput() input: CreateUserDto) {\n * // input contains the tool arguments\n * }\n * ```\n */\nexport function McpInput(): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'input',\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a URI parameter from a resource\n *\n * @example\n * ```typescript\n * @McpResource({ uri: 'user://{userId}', name: 'User' })\n * async getUser(@McpParam('userId') userId: string) {\n * // userId is extracted from the URI\n * }\n * ```\n */\nexport function McpParam(name: string): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'param',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a prompt argument\n *\n * @example\n * ```typescript\n * @McpPrompt({ name: 'welcome', description: 'Welcome prompt' })\n * async generateWelcome(@McpPromptArg('userName') userName: string) {\n * // userName is the prompt argument\n * }\n * ```\n */\nexport function McpPromptArg(name: string): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'promptArg',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS, extractMetadata, type ScannedMetadata } from '@mcp-weave/core';\nimport type {\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n} from '@mcp-weave/core';\n\n// Re-export for convenience\nexport { METADATA_KEYS, extractMetadata };\nexport type {\n ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n};\n\n/**\n * Check if a class has @McpServer decorator\n */\nexport function isMcpServer(target: Function): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get all MCP servers from an array of classes\n */\nexport function getMcpServers(targets: Function[]): Function[] {\n return targets.filter(isMcpServer);\n}\n\n/**\n * Get server metadata from a class\n */\nexport function getServerMetadata(target: Function): McpServerMetadata | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get tools metadata from a class\n */\nexport function getToolsMetadata(target: Function): McpToolMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.TOOLS, target) ?? [];\n}\n\n/**\n * Get resources metadata from a class\n */\nexport function getResourcesMetadata(target: Function): McpResourceMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.RESOURCES, target) ?? [];\n}\n\n/**\n * Get prompts metadata from a class\n */\nexport function getPromptsMetadata(target: Function): McpPromptMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PROMPTS, target) ?? [];\n}\n\n/**\n * Get params metadata from a class\n */\nexport function getParamsMetadata(target: Function): McpParamMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PARAMS, target) ?? [];\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { extractMetadata } from '../metadata/storage.js';\n\n/**\n * Options for MCP runtime server\n */\nexport interface McpRuntimeOptions {\n /**\n * Transport type\n */\n transport?: 'stdio' | 'sse';\n}\n\n/**\n * Runtime MCP server that wraps a decorated class\n */\nexport class McpRuntimeServer {\n private server: Server;\n private instance: any;\n private metadata;\n\n constructor(target: Function, _options: McpRuntimeOptions = {}) {\n this.metadata = extractMetadata(target);\n\n if (!this.metadata.server) {\n throw new Error(`Class ${target.name} is not decorated with @McpServer`);\n }\n\n this.server = new Server(\n {\n name: this.metadata.server.name,\n version: this.metadata.server.version ?? '1.0.0',\n },\n {\n capabilities: {\n tools: this.metadata.tools.length > 0 ? {} : undefined,\n resources: this.metadata.resources.length > 0 ? {} : undefined,\n prompts: this.metadata.prompts.length > 0 ? {} : undefined,\n },\n }\n );\n\n // Create instance of the target class\n this.instance = new (target as any)();\n\n this.setupHandlers();\n }\n\n private setupHandlers() {\n this.setupToolHandlers();\n this.setupResourceHandlers();\n this.setupPromptHandlers();\n }\n\n private setupToolHandlers() {\n const tools = this.metadata.tools;\n if (tools.length === 0) return;\n\n // List tools\n this.server.setRequestHandler({ method: 'tools/list' } as any, async () => ({\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? { type: 'object' as const, properties: {} },\n })),\n }));\n\n // Call tool\n this.server.setRequestHandler({ method: 'tools/call' } as any, async (request: any) => {\n const toolName = request.params.name;\n const tool = tools.find(t => t.name === toolName);\n\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const method = this.instance[tool.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(tool.propertyKey)} not found`);\n }\n\n const args = this.resolveToolArgs(tool.propertyKey, request.params.arguments ?? {});\n const result = await method.apply(this.instance, args);\n\n return {\n content: [\n {\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result),\n },\n ],\n };\n });\n }\n\n private setupResourceHandlers() {\n const resources = this.metadata.resources;\n if (resources.length === 0) return;\n\n // List resources\n this.server.setRequestHandler({ method: 'resources/list' } as any, async () => ({\n resources: resources.map(resource => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n })),\n }));\n\n // Read resource\n this.server.setRequestHandler({ method: 'resources/read' } as any, async (request: any) => {\n const uri = request.params.uri as string;\n\n // Find matching resource\n for (const resource of resources) {\n const params = this.extractUriParams(resource.uri, uri);\n if (params) {\n const method = this.instance[resource.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(resource.propertyKey)} not found`);\n }\n\n const args = this.resolveResourceArgs(resource.propertyKey, params);\n return await method.apply(this.instance, args);\n }\n }\n\n throw new Error(`Resource not found: ${uri}`);\n });\n }\n\n private setupPromptHandlers() {\n const prompts = this.metadata.prompts;\n if (prompts.length === 0) return;\n\n // List prompts\n this.server.setRequestHandler({ method: 'prompts/list' } as any, async () => ({\n prompts: prompts.map(prompt => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.arguments ?? [],\n })),\n }));\n\n // Get prompt\n this.server.setRequestHandler({ method: 'prompts/get' } as any, async (request: any) => {\n const promptName = request.params.name;\n const prompt = prompts.find(p => p.name === promptName);\n\n if (!prompt) {\n throw new Error(`Unknown prompt: ${promptName}`);\n }\n\n const method = this.instance[prompt.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(prompt.propertyKey)} not found`);\n }\n\n const args = this.resolvePromptArgs(prompt.propertyKey, request.params.arguments ?? {});\n return await method.apply(this.instance, args);\n });\n }\n\n private resolveToolArgs(propertyKey: string | symbol, input: Record<string, any>): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'input'\n );\n\n if (params.length === 0) {\n return [input];\n }\n\n const args: any[] = [];\n for (const param of params) {\n args[param.parameterIndex] = input;\n }\n return args;\n }\n\n private resolveResourceArgs(\n propertyKey: string | symbol,\n uriParams: Record<string, string>\n ): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'param'\n );\n\n const args: any[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = uriParams[param.name];\n }\n }\n return args;\n }\n\n private resolvePromptArgs(propertyKey: string | symbol, promptArgs: Record<string, any>): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'promptArg'\n );\n\n const args: any[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = promptArgs[param.name];\n }\n }\n return args;\n }\n\n private extractUriParams(template: string, uri: string): Record<string, string> | null {\n // Convert template to regex: user://{userId} -> user://([^/]+)\n const paramNames: string[] = [];\n const regexStr = template.replace(/\\{(\\w+)\\}/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n\n const regex = new RegExp(`^${regexStr}$`);\n const match = uri.match(regex);\n\n if (!match) return null;\n\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1] ?? '';\n });\n\n return params;\n }\n\n /**\n * Start the MCP server\n */\n async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(`MCP server '${this.metadata.server?.name}' started on stdio`);\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): Server {\n return this.server;\n }\n}\n\n/**\n * Create and start an MCP server from a decorated class\n */\nexport async function createMcpServer(\n target: Function,\n options?: McpRuntimeOptions\n): Promise<McpRuntimeServer> {\n const server = new McpRuntimeServer(target, options);\n await server.start();\n return server;\n}\n","// @mcp-weave/nestjs\n// NestJS integration for MCP-Weave\n\nimport 'reflect-metadata';\n\n// Decorators\nexport * from './decorators/mcp-server.js';\nexport * from './decorators/mcp-tool.js';\nexport * from './decorators/mcp-resource.js';\nexport * from './decorators/mcp-prompt.js';\nexport * from './decorators/params.js';\n\n// Metadata\nexport * from './metadata/storage.js';\n\n// Runtime\nexport * from './runtime/server.js';\n\n// Version\nexport const VERSION = '0.1.0';\n"]}
1
+ {"version":3,"sources":["../src/decorators/mcp-server.ts","../src/decorators/mcp-tool.ts","../src/decorators/mcp-resource.ts","../src/decorators/mcp-prompt.ts","../src/decorators/params.ts","../src/metadata/storage.ts","../src/runtime/server.ts","../src/index.ts"],"names":["METADATA_KEYS","extractMetadata","Server","StdioServerTransport"],"mappings":"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","file":"index.js","sourcesContent":["import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpServerMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpServer decorator\n */\nexport interface McpServerOptions {\n /**\n * Server name\n */\n name: string;\n\n /**\n * Server version (default: '1.0.0')\n */\n version?: string;\n\n /**\n * Server description\n */\n description?: string;\n}\n\n/**\n * Marks a class as an MCP server\n *\n * @example\n * ```typescript\n * @McpServer({ name: 'my-service', version: '1.0.0' })\n * export class MyController {\n * // ...\n * }\n * ```\n */\nexport function McpServer(options: McpServerOptions): ClassDecorator {\n return (target: Function) => {\n const metadata: McpServerMetadata = {\n name: options.name,\n version: options.version ?? '1.0.0',\n description: options.description,\n target,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.SERVER, metadata, target);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpToolMetadata, ToolInputSchema } from '@mcp-weave/core';\n\n/**\n * Options for @McpTool decorator\n */\nexport interface McpToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool description\n */\n description: string;\n\n /**\n * Input schema (JSON Schema)\n */\n inputSchema?: ToolInputSchema;\n}\n\n/**\n * Marks a method as an MCP tool\n *\n * @example\n * ```typescript\n * @McpTool({\n * name: 'create_user',\n * description: 'Creates a new user'\n * })\n * async createUser(@McpInput() input: CreateUserDto) {\n * return { success: true };\n * }\n * ```\n */\nexport function McpTool(options: McpToolOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingTools: McpToolMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.TOOLS, constructor) ?? [];\n\n const metadata: McpToolMetadata = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.TOOLS, [...existingTools, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpResourceMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpResource decorator\n */\nexport interface McpResourceOptions {\n /**\n * Resource URI template (e.g., 'user://{userId}')\n */\n uri: string;\n\n /**\n * Resource name\n */\n name: string;\n\n /**\n * Resource description\n */\n description?: string;\n\n /**\n * MIME type (default: 'application/json')\n */\n mimeType?: string;\n}\n\n/**\n * Marks a method as an MCP resource\n *\n * @example\n * ```typescript\n * @McpResource({\n * uri: 'user://{userId}',\n * name: 'User Profile',\n * mimeType: 'application/json'\n * })\n * async getUserProfile(@McpParam('userId') userId: string) {\n * return { contents: [...] };\n * }\n * ```\n */\nexport function McpResource(options: McpResourceOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingResources: McpResourceMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.RESOURCES, constructor) ?? [];\n\n const metadata: McpResourceMetadata = {\n uri: options.uri,\n name: options.name,\n description: options.description,\n mimeType: options.mimeType ?? 'application/json',\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.RESOURCES, [...existingResources, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpPromptMetadata, PromptArgument } from '@mcp-weave/core';\n\n/**\n * Options for @McpPrompt decorator\n */\nexport interface McpPromptOptions {\n /**\n * Prompt name\n */\n name: string;\n\n /**\n * Prompt description\n */\n description: string;\n\n /**\n * Prompt arguments\n */\n arguments?: PromptArgument[];\n}\n\n/**\n * Marks a method as an MCP prompt\n *\n * @example\n * ```typescript\n * @McpPrompt({\n * name: 'welcome_email',\n * description: 'Generate welcome email for new user'\n * })\n * async generateWelcomeEmail(\n * @McpPromptArg('userName') userName: string\n * ) {\n * return { messages: [...] };\n * }\n * ```\n */\nexport function McpPrompt(options: McpPromptOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingPrompts: McpPromptMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PROMPTS, constructor) ?? [];\n\n const metadata: McpPromptMetadata = {\n name: options.name,\n description: options.description,\n arguments: options.arguments,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PROMPTS, [...existingPrompts, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpParamMetadata } from '@mcp-weave/core';\n\n/**\n * Injects the tool input\n *\n * @example\n * ```typescript\n * @McpTool({ name: 'create_user', description: 'Creates a user' })\n * async createUser(@McpInput() input: CreateUserDto) {\n * // input contains the tool arguments\n * }\n * ```\n */\nexport function McpInput(): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'input',\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a URI parameter from a resource\n *\n * @example\n * ```typescript\n * @McpResource({ uri: 'user://{userId}', name: 'User' })\n * async getUser(@McpParam('userId') userId: string) {\n * // userId is extracted from the URI\n * }\n * ```\n */\nexport function McpParam(name: string): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'param',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a prompt argument\n *\n * @example\n * ```typescript\n * @McpPrompt({ name: 'welcome', description: 'Welcome prompt' })\n * async generateWelcome(@McpPromptArg('userName') userName: string) {\n * // userName is the prompt argument\n * }\n * ```\n */\nexport function McpPromptArg(name: string): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'promptArg',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport {\n METADATA_KEYS,\n extractMetadata,\n type ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n} from '@mcp-weave/core';\n\n// Re-export for convenience\nexport { METADATA_KEYS, extractMetadata };\nexport type {\n ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n};\n\n/**\n * Check if a class has @McpServer decorator\n */\nexport function isMcpServer(target: Function): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get all MCP servers from an array of classes\n */\nexport function getMcpServers(targets: Function[]): Function[] {\n return targets.filter(isMcpServer);\n}\n\n/**\n * Get server metadata from a class\n */\nexport function getServerMetadata(target: Function): McpServerMetadata | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get tools metadata from a class\n */\nexport function getToolsMetadata(target: Function): McpToolMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.TOOLS, target) ?? [];\n}\n\n/**\n * Get resources metadata from a class\n */\nexport function getResourcesMetadata(target: Function): McpResourceMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.RESOURCES, target) ?? [];\n}\n\n/**\n * Get prompts metadata from a class\n */\nexport function getPromptsMetadata(target: Function): McpPromptMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PROMPTS, target) ?? [];\n}\n\n/**\n * Get params metadata from a class\n */\nexport function getParamsMetadata(target: Function): McpParamMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PARAMS, target) ?? [];\n}\n","import { Server, StdioServerTransport, AnyObjectSchema } from './sdk-compat.js';\nimport { extractMetadata } from '../metadata/storage.js';\n\n/**\n * Options for MCP runtime server\n */\nexport interface McpRuntimeOptions {\n /**\n * Transport type\n */\n transport?: 'stdio' | 'sse';\n}\n\n/**\n * Runtime MCP server that wraps a decorated class\n */\nexport class McpRuntimeServer {\n private server: Server;\n private instance: unknown;\n private metadata;\n\n constructor(target: Function, _options: McpRuntimeOptions = {}) {\n this.metadata = extractMetadata(target);\n\n if (!this.metadata.server) {\n throw new Error(`Class ${target.name} is not decorated with @McpServer`);\n }\n\n this.server = new Server(\n {\n name: this.metadata.server.name,\n version: this.metadata.server.version ?? '1.0.0',\n },\n {\n capabilities: {\n tools: this.metadata.tools.length > 0 ? {} : undefined,\n resources: this.metadata.resources.length > 0 ? {} : undefined,\n prompts: this.metadata.prompts.length > 0 ? {} : undefined,\n },\n }\n );\n\n // Create instance of the target class\n this.instance = new (target as unknown as { new (): unknown })();\n\n this.setupHandlers();\n }\n\n private setupHandlers() {\n this.setupToolHandlers();\n this.setupResourceHandlers();\n this.setupPromptHandlers();\n }\n\n private setupToolHandlers() {\n const tools = this.metadata.tools;\n if (tools.length === 0) return;\n\n // List tools\n this.server.setRequestHandler(\n { method: 'tools/list' } as unknown as AnyObjectSchema,\n async () => ({\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? { type: 'object' as const, properties: {} },\n })),\n })\n );\n\n // Call tool\n this.server.setRequestHandler(\n { method: 'tools/call' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const toolName = params.name as string;\n const tool = tools.find(t => t.name === toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n const method = Reflect.get(this.instance as object, tool.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(tool.propertyKey)} not found`);\n }\n const args = this.resolveToolArgs(\n tool.propertyKey,\n (params.arguments ?? {}) as Record<string, unknown>\n );\n const result = await method.apply(this.instance as object, args);\n return {\n content: [\n {\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result),\n },\n ],\n };\n }\n );\n }\n\n private setupResourceHandlers() {\n const resources = this.metadata.resources;\n if (resources.length === 0) return;\n\n // List resources\n this.server.setRequestHandler(\n { method: 'resources/list' } as unknown as AnyObjectSchema,\n async () => ({\n resources: resources.map(resource => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n })),\n })\n );\n\n // Read resource\n this.server.setRequestHandler(\n { method: 'resources/read' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const uri = params.uri as string;\n // Find matching resource\n for (const resource of resources) {\n const uriParams = this.extractUriParams(resource.uri, uri);\n if (uriParams) {\n const method = Reflect.get(this.instance as object, resource.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(resource.propertyKey)} not found`);\n }\n const args = this.resolveResourceArgs(resource.propertyKey, uriParams);\n return await method.apply(this.instance as object, args);\n }\n }\n throw new Error(`Resource not found: ${uri}`);\n }\n );\n }\n\n private setupPromptHandlers() {\n const prompts = this.metadata.prompts;\n if (prompts.length === 0) return;\n\n // List prompts\n this.server.setRequestHandler(\n { method: 'prompts/list' } as unknown as AnyObjectSchema,\n async () => ({\n prompts: prompts.map(prompt => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.arguments ?? [],\n })),\n })\n );\n\n // Get prompt\n this.server.setRequestHandler(\n { method: 'prompts/get' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const promptName = params.name as string;\n const prompt = prompts.find(p => p.name === promptName);\n if (!prompt) {\n throw new Error(`Unknown prompt: ${promptName}`);\n }\n const method = Reflect.get(this.instance as object, prompt.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(prompt.propertyKey)} not found`);\n }\n const args = this.resolvePromptArgs(\n prompt.propertyKey,\n (params.arguments ?? {}) as Record<string, unknown>\n );\n return await method.apply(this.instance as object, args);\n }\n );\n }\n\n private resolveToolArgs(propertyKey: string | symbol, input: Record<string, unknown>): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'input'\n );\n\n if (params.length === 0) {\n return [input];\n }\n\n const args: unknown[] = [];\n for (const param of params) {\n args[param.parameterIndex] = input;\n }\n return args;\n }\n\n private resolveResourceArgs(\n propertyKey: string | symbol,\n uriParams: Record<string, string>\n ): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'param'\n );\n\n const args: unknown[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = uriParams[param.name];\n }\n }\n return args;\n }\n\n private resolvePromptArgs(\n propertyKey: string | symbol,\n promptArgs: Record<string, unknown>\n ): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'promptArg'\n );\n\n const args: unknown[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = promptArgs[param.name];\n }\n }\n return args;\n }\n\n private extractUriParams(template: string, uri: string): Record<string, string> | null {\n // Convert template to regex: user://{userId} -> user://([^/]+)\n const paramNames: string[] = [];\n const regexStr = template.replace(/\\{(\\w+)\\}/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n\n const regex = new RegExp(`^${regexStr}$`);\n const match = uri.match(regex);\n\n if (!match) return null;\n\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1] ?? '';\n });\n\n return params;\n }\n\n /**\n * Start the MCP server\n */\n async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(`MCP server '${this.metadata.server?.name}' started on stdio`);\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): Server {\n return this.server;\n }\n}\n\n/**\n * Create and start an MCP server from a decorated class\n */\nexport async function createMcpServer(\n target: Function,\n options?: McpRuntimeOptions\n): Promise<McpRuntimeServer> {\n const server = new McpRuntimeServer(target, options);\n await server.start();\n return server;\n}\n","// @mcp-weave/nestjs\n// NestJS integration for MCP-Weave\n\nimport 'reflect-metadata';\n\n// Decorators\nexport * from './decorators/mcp-server.js';\nexport * from './decorators/mcp-tool.js';\nexport * from './decorators/mcp-resource.js';\nexport * from './decorators/mcp-prompt.js';\nexport * from './decorators/params.js';\n\n// Metadata\nexport * from './metadata/storage.js';\n\n// Runtime\nexport * from './runtime/server.js';\n\n// Version\nexport const VERSION = '0.1.0';\n"]}
package/dist/index.mjs CHANGED
@@ -124,6 +124,8 @@ function getPromptsMetadata(target) {
124
124
  function getParamsMetadata(target) {
125
125
  return Reflect.getMetadata(METADATA_KEYS.PARAMS, target) ?? [];
126
126
  }
127
+
128
+ // src/runtime/server.ts
127
129
  var McpRuntimeServer = class {
128
130
  server;
129
131
  instance;
@@ -157,85 +159,118 @@ var McpRuntimeServer = class {
157
159
  setupToolHandlers() {
158
160
  const tools = this.metadata.tools;
159
161
  if (tools.length === 0) return;
160
- this.server.setRequestHandler({ method: "tools/list" }, async () => ({
161
- tools: tools.map((tool) => ({
162
- name: tool.name,
163
- description: tool.description,
164
- inputSchema: tool.inputSchema ?? { type: "object", properties: {} }
165
- }))
166
- }));
167
- this.server.setRequestHandler({ method: "tools/call" }, async (request) => {
168
- const toolName = request.params.name;
169
- const tool = tools.find((t) => t.name === toolName);
170
- if (!tool) {
171
- throw new Error(`Unknown tool: ${toolName}`);
172
- }
173
- const method = this.instance[tool.propertyKey];
174
- if (typeof method !== "function") {
175
- throw new Error(`Method ${String(tool.propertyKey)} not found`);
162
+ this.server.setRequestHandler(
163
+ { method: "tools/list" },
164
+ async () => ({
165
+ tools: tools.map((tool) => ({
166
+ name: tool.name,
167
+ description: tool.description,
168
+ inputSchema: tool.inputSchema ?? { type: "object", properties: {} }
169
+ }))
170
+ })
171
+ );
172
+ this.server.setRequestHandler(
173
+ { method: "tools/call" },
174
+ async (request) => {
175
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
176
+ const params = request.params;
177
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
178
+ const toolName = params.name;
179
+ const tool = tools.find((t) => t.name === toolName);
180
+ if (!tool) {
181
+ throw new Error(`Unknown tool: ${toolName}`);
182
+ }
183
+ const method = Reflect.get(this.instance, tool.propertyKey);
184
+ if (typeof method !== "function") {
185
+ throw new Error(`Method ${String(tool.propertyKey)} not found`);
186
+ }
187
+ const args = this.resolveToolArgs(
188
+ tool.propertyKey,
189
+ params.arguments ?? {}
190
+ );
191
+ const result = await method.apply(this.instance, args);
192
+ return {
193
+ content: [
194
+ {
195
+ type: "text",
196
+ text: typeof result === "string" ? result : JSON.stringify(result)
197
+ }
198
+ ]
199
+ };
176
200
  }
177
- const args = this.resolveToolArgs(tool.propertyKey, request.params.arguments ?? {});
178
- const result = await method.apply(this.instance, args);
179
- return {
180
- content: [
181
- {
182
- type: "text",
183
- text: typeof result === "string" ? result : JSON.stringify(result)
184
- }
185
- ]
186
- };
187
- });
201
+ );
188
202
  }
189
203
  setupResourceHandlers() {
190
204
  const resources = this.metadata.resources;
191
205
  if (resources.length === 0) return;
192
- this.server.setRequestHandler({ method: "resources/list" }, async () => ({
193
- resources: resources.map((resource) => ({
194
- uri: resource.uri,
195
- name: resource.name,
196
- description: resource.description,
197
- mimeType: resource.mimeType
198
- }))
199
- }));
200
- this.server.setRequestHandler({ method: "resources/read" }, async (request) => {
201
- const uri = request.params.uri;
202
- for (const resource of resources) {
203
- const params = this.extractUriParams(resource.uri, uri);
204
- if (params) {
205
- const method = this.instance[resource.propertyKey];
206
- if (typeof method !== "function") {
207
- throw new Error(`Method ${String(resource.propertyKey)} not found`);
206
+ this.server.setRequestHandler(
207
+ { method: "resources/list" },
208
+ async () => ({
209
+ resources: resources.map((resource) => ({
210
+ uri: resource.uri,
211
+ name: resource.name,
212
+ description: resource.description,
213
+ mimeType: resource.mimeType
214
+ }))
215
+ })
216
+ );
217
+ this.server.setRequestHandler(
218
+ { method: "resources/read" },
219
+ async (request) => {
220
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
221
+ const params = request.params;
222
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
223
+ const uri = params.uri;
224
+ for (const resource of resources) {
225
+ const uriParams = this.extractUriParams(resource.uri, uri);
226
+ if (uriParams) {
227
+ const method = Reflect.get(this.instance, resource.propertyKey);
228
+ if (typeof method !== "function") {
229
+ throw new Error(`Method ${String(resource.propertyKey)} not found`);
230
+ }
231
+ const args = this.resolveResourceArgs(resource.propertyKey, uriParams);
232
+ return await method.apply(this.instance, args);
208
233
  }
209
- const args = this.resolveResourceArgs(resource.propertyKey, params);
210
- return await method.apply(this.instance, args);
211
234
  }
235
+ throw new Error(`Resource not found: ${uri}`);
212
236
  }
213
- throw new Error(`Resource not found: ${uri}`);
214
- });
237
+ );
215
238
  }
216
239
  setupPromptHandlers() {
217
240
  const prompts = this.metadata.prompts;
218
241
  if (prompts.length === 0) return;
219
- this.server.setRequestHandler({ method: "prompts/list" }, async () => ({
220
- prompts: prompts.map((prompt) => ({
221
- name: prompt.name,
222
- description: prompt.description,
223
- arguments: prompt.arguments ?? []
224
- }))
225
- }));
226
- this.server.setRequestHandler({ method: "prompts/get" }, async (request) => {
227
- const promptName = request.params.name;
228
- const prompt = prompts.find((p) => p.name === promptName);
229
- if (!prompt) {
230
- throw new Error(`Unknown prompt: ${promptName}`);
231
- }
232
- const method = this.instance[prompt.propertyKey];
233
- if (typeof method !== "function") {
234
- throw new Error(`Method ${String(prompt.propertyKey)} not found`);
242
+ this.server.setRequestHandler(
243
+ { method: "prompts/list" },
244
+ async () => ({
245
+ prompts: prompts.map((prompt) => ({
246
+ name: prompt.name,
247
+ description: prompt.description,
248
+ arguments: prompt.arguments ?? []
249
+ }))
250
+ })
251
+ );
252
+ this.server.setRequestHandler(
253
+ { method: "prompts/get" },
254
+ async (request) => {
255
+ if (!request || typeof request !== "object") throw new Error("Invalid request");
256
+ const params = request.params;
257
+ if (!params || typeof params !== "object") throw new Error("Invalid params");
258
+ const promptName = params.name;
259
+ const prompt = prompts.find((p) => p.name === promptName);
260
+ if (!prompt) {
261
+ throw new Error(`Unknown prompt: ${promptName}`);
262
+ }
263
+ const method = Reflect.get(this.instance, prompt.propertyKey);
264
+ if (typeof method !== "function") {
265
+ throw new Error(`Method ${String(prompt.propertyKey)} not found`);
266
+ }
267
+ const args = this.resolvePromptArgs(
268
+ prompt.propertyKey,
269
+ params.arguments ?? {}
270
+ );
271
+ return await method.apply(this.instance, args);
235
272
  }
236
- const args = this.resolvePromptArgs(prompt.propertyKey, request.params.arguments ?? {});
237
- return await method.apply(this.instance, args);
238
- });
273
+ );
239
274
  }
240
275
  resolveToolArgs(propertyKey, input) {
241
276
  const params = this.metadata.params.filter(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decorators/mcp-server.ts","../src/decorators/mcp-tool.ts","../src/decorators/mcp-resource.ts","../src/decorators/mcp-prompt.ts","../src/decorators/params.ts","../src/metadata/storage.ts","../src/runtime/server.ts","../src/index.ts"],"names":["METADATA_KEYS"],"mappings":"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","file":"index.mjs","sourcesContent":["import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpServerMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpServer decorator\n */\nexport interface McpServerOptions {\n /**\n * Server name\n */\n name: string;\n\n /**\n * Server version (default: '1.0.0')\n */\n version?: string;\n\n /**\n * Server description\n */\n description?: string;\n}\n\n/**\n * Marks a class as an MCP server\n *\n * @example\n * ```typescript\n * @McpServer({ name: 'my-service', version: '1.0.0' })\n * export class MyController {\n * // ...\n * }\n * ```\n */\nexport function McpServer(options: McpServerOptions): ClassDecorator {\n return (target: Function) => {\n const metadata: McpServerMetadata = {\n name: options.name,\n version: options.version ?? '1.0.0',\n description: options.description,\n target,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.SERVER, metadata, target);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpToolMetadata, ToolInputSchema } from '@mcp-weave/core';\n\n/**\n * Options for @McpTool decorator\n */\nexport interface McpToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool description\n */\n description: string;\n\n /**\n * Input schema (JSON Schema)\n */\n inputSchema?: ToolInputSchema;\n}\n\n/**\n * Marks a method as an MCP tool\n *\n * @example\n * ```typescript\n * @McpTool({\n * name: 'create_user',\n * description: 'Creates a new user'\n * })\n * async createUser(@McpInput() input: CreateUserDto) {\n * return { success: true };\n * }\n * ```\n */\nexport function McpTool(options: McpToolOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingTools: McpToolMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.TOOLS, constructor) ?? [];\n\n const metadata: McpToolMetadata = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.TOOLS, [...existingTools, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpResourceMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpResource decorator\n */\nexport interface McpResourceOptions {\n /**\n * Resource URI template (e.g., 'user://{userId}')\n */\n uri: string;\n\n /**\n * Resource name\n */\n name: string;\n\n /**\n * Resource description\n */\n description?: string;\n\n /**\n * MIME type (default: 'application/json')\n */\n mimeType?: string;\n}\n\n/**\n * Marks a method as an MCP resource\n *\n * @example\n * ```typescript\n * @McpResource({\n * uri: 'user://{userId}',\n * name: 'User Profile',\n * mimeType: 'application/json'\n * })\n * async getUserProfile(@McpParam('userId') userId: string) {\n * return { contents: [...] };\n * }\n * ```\n */\nexport function McpResource(options: McpResourceOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingResources: McpResourceMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.RESOURCES, constructor) ?? [];\n\n const metadata: McpResourceMetadata = {\n uri: options.uri,\n name: options.name,\n description: options.description,\n mimeType: options.mimeType ?? 'application/json',\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.RESOURCES, [...existingResources, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpPromptMetadata, PromptArgument } from '@mcp-weave/core';\n\n/**\n * Options for @McpPrompt decorator\n */\nexport interface McpPromptOptions {\n /**\n * Prompt name\n */\n name: string;\n\n /**\n * Prompt description\n */\n description: string;\n\n /**\n * Prompt arguments\n */\n arguments?: PromptArgument[];\n}\n\n/**\n * Marks a method as an MCP prompt\n *\n * @example\n * ```typescript\n * @McpPrompt({\n * name: 'welcome_email',\n * description: 'Generate welcome email for new user'\n * })\n * async generateWelcomeEmail(\n * @McpPromptArg('userName') userName: string\n * ) {\n * return { messages: [...] };\n * }\n * ```\n */\nexport function McpPrompt(options: McpPromptOptions): MethodDecorator {\n return (target: Object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingPrompts: McpPromptMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PROMPTS, constructor) ?? [];\n\n const metadata: McpPromptMetadata = {\n name: options.name,\n description: options.description,\n arguments: options.arguments,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PROMPTS, [...existingPrompts, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpParamMetadata } from '@mcp-weave/core';\n\n/**\n * Injects the tool input\n *\n * @example\n * ```typescript\n * @McpTool({ name: 'create_user', description: 'Creates a user' })\n * async createUser(@McpInput() input: CreateUserDto) {\n * // input contains the tool arguments\n * }\n * ```\n */\nexport function McpInput(): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'input',\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a URI parameter from a resource\n *\n * @example\n * ```typescript\n * @McpResource({ uri: 'user://{userId}', name: 'User' })\n * async getUser(@McpParam('userId') userId: string) {\n * // userId is extracted from the URI\n * }\n * ```\n */\nexport function McpParam(name: string): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'param',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a prompt argument\n *\n * @example\n * ```typescript\n * @McpPrompt({ name: 'welcome', description: 'Welcome prompt' })\n * async generateWelcome(@McpPromptArg('userName') userName: string) {\n * // userName is the prompt argument\n * }\n * ```\n */\nexport function McpPromptArg(name: string): ParameterDecorator {\n return (target: Object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'promptArg',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS, extractMetadata, type ScannedMetadata } from '@mcp-weave/core';\nimport type {\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n} from '@mcp-weave/core';\n\n// Re-export for convenience\nexport { METADATA_KEYS, extractMetadata };\nexport type {\n ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n};\n\n/**\n * Check if a class has @McpServer decorator\n */\nexport function isMcpServer(target: Function): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get all MCP servers from an array of classes\n */\nexport function getMcpServers(targets: Function[]): Function[] {\n return targets.filter(isMcpServer);\n}\n\n/**\n * Get server metadata from a class\n */\nexport function getServerMetadata(target: Function): McpServerMetadata | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get tools metadata from a class\n */\nexport function getToolsMetadata(target: Function): McpToolMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.TOOLS, target) ?? [];\n}\n\n/**\n * Get resources metadata from a class\n */\nexport function getResourcesMetadata(target: Function): McpResourceMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.RESOURCES, target) ?? [];\n}\n\n/**\n * Get prompts metadata from a class\n */\nexport function getPromptsMetadata(target: Function): McpPromptMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PROMPTS, target) ?? [];\n}\n\n/**\n * Get params metadata from a class\n */\nexport function getParamsMetadata(target: Function): McpParamMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PARAMS, target) ?? [];\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nimport { extractMetadata } from '../metadata/storage.js';\n\n/**\n * Options for MCP runtime server\n */\nexport interface McpRuntimeOptions {\n /**\n * Transport type\n */\n transport?: 'stdio' | 'sse';\n}\n\n/**\n * Runtime MCP server that wraps a decorated class\n */\nexport class McpRuntimeServer {\n private server: Server;\n private instance: any;\n private metadata;\n\n constructor(target: Function, _options: McpRuntimeOptions = {}) {\n this.metadata = extractMetadata(target);\n\n if (!this.metadata.server) {\n throw new Error(`Class ${target.name} is not decorated with @McpServer`);\n }\n\n this.server = new Server(\n {\n name: this.metadata.server.name,\n version: this.metadata.server.version ?? '1.0.0',\n },\n {\n capabilities: {\n tools: this.metadata.tools.length > 0 ? {} : undefined,\n resources: this.metadata.resources.length > 0 ? {} : undefined,\n prompts: this.metadata.prompts.length > 0 ? {} : undefined,\n },\n }\n );\n\n // Create instance of the target class\n this.instance = new (target as any)();\n\n this.setupHandlers();\n }\n\n private setupHandlers() {\n this.setupToolHandlers();\n this.setupResourceHandlers();\n this.setupPromptHandlers();\n }\n\n private setupToolHandlers() {\n const tools = this.metadata.tools;\n if (tools.length === 0) return;\n\n // List tools\n this.server.setRequestHandler({ method: 'tools/list' } as any, async () => ({\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? { type: 'object' as const, properties: {} },\n })),\n }));\n\n // Call tool\n this.server.setRequestHandler({ method: 'tools/call' } as any, async (request: any) => {\n const toolName = request.params.name;\n const tool = tools.find(t => t.name === toolName);\n\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n\n const method = this.instance[tool.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(tool.propertyKey)} not found`);\n }\n\n const args = this.resolveToolArgs(tool.propertyKey, request.params.arguments ?? {});\n const result = await method.apply(this.instance, args);\n\n return {\n content: [\n {\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result),\n },\n ],\n };\n });\n }\n\n private setupResourceHandlers() {\n const resources = this.metadata.resources;\n if (resources.length === 0) return;\n\n // List resources\n this.server.setRequestHandler({ method: 'resources/list' } as any, async () => ({\n resources: resources.map(resource => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n })),\n }));\n\n // Read resource\n this.server.setRequestHandler({ method: 'resources/read' } as any, async (request: any) => {\n const uri = request.params.uri as string;\n\n // Find matching resource\n for (const resource of resources) {\n const params = this.extractUriParams(resource.uri, uri);\n if (params) {\n const method = this.instance[resource.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(resource.propertyKey)} not found`);\n }\n\n const args = this.resolveResourceArgs(resource.propertyKey, params);\n return await method.apply(this.instance, args);\n }\n }\n\n throw new Error(`Resource not found: ${uri}`);\n });\n }\n\n private setupPromptHandlers() {\n const prompts = this.metadata.prompts;\n if (prompts.length === 0) return;\n\n // List prompts\n this.server.setRequestHandler({ method: 'prompts/list' } as any, async () => ({\n prompts: prompts.map(prompt => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.arguments ?? [],\n })),\n }));\n\n // Get prompt\n this.server.setRequestHandler({ method: 'prompts/get' } as any, async (request: any) => {\n const promptName = request.params.name;\n const prompt = prompts.find(p => p.name === promptName);\n\n if (!prompt) {\n throw new Error(`Unknown prompt: ${promptName}`);\n }\n\n const method = this.instance[prompt.propertyKey];\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(prompt.propertyKey)} not found`);\n }\n\n const args = this.resolvePromptArgs(prompt.propertyKey, request.params.arguments ?? {});\n return await method.apply(this.instance, args);\n });\n }\n\n private resolveToolArgs(propertyKey: string | symbol, input: Record<string, any>): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'input'\n );\n\n if (params.length === 0) {\n return [input];\n }\n\n const args: any[] = [];\n for (const param of params) {\n args[param.parameterIndex] = input;\n }\n return args;\n }\n\n private resolveResourceArgs(\n propertyKey: string | symbol,\n uriParams: Record<string, string>\n ): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'param'\n );\n\n const args: any[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = uriParams[param.name];\n }\n }\n return args;\n }\n\n private resolvePromptArgs(propertyKey: string | symbol, promptArgs: Record<string, any>): any[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'promptArg'\n );\n\n const args: any[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = promptArgs[param.name];\n }\n }\n return args;\n }\n\n private extractUriParams(template: string, uri: string): Record<string, string> | null {\n // Convert template to regex: user://{userId} -> user://([^/]+)\n const paramNames: string[] = [];\n const regexStr = template.replace(/\\{(\\w+)\\}/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n\n const regex = new RegExp(`^${regexStr}$`);\n const match = uri.match(regex);\n\n if (!match) return null;\n\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1] ?? '';\n });\n\n return params;\n }\n\n /**\n * Start the MCP server\n */\n async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(`MCP server '${this.metadata.server?.name}' started on stdio`);\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): Server {\n return this.server;\n }\n}\n\n/**\n * Create and start an MCP server from a decorated class\n */\nexport async function createMcpServer(\n target: Function,\n options?: McpRuntimeOptions\n): Promise<McpRuntimeServer> {\n const server = new McpRuntimeServer(target, options);\n await server.start();\n return server;\n}\n","// @mcp-weave/nestjs\n// NestJS integration for MCP-Weave\n\nimport 'reflect-metadata';\n\n// Decorators\nexport * from './decorators/mcp-server.js';\nexport * from './decorators/mcp-tool.js';\nexport * from './decorators/mcp-resource.js';\nexport * from './decorators/mcp-prompt.js';\nexport * from './decorators/params.js';\n\n// Metadata\nexport * from './metadata/storage.js';\n\n// Runtime\nexport * from './runtime/server.js';\n\n// Version\nexport const VERSION = '0.1.0';\n"]}
1
+ {"version":3,"sources":["../src/decorators/mcp-server.ts","../src/decorators/mcp-tool.ts","../src/decorators/mcp-resource.ts","../src/decorators/mcp-prompt.ts","../src/decorators/params.ts","../src/metadata/storage.ts","../src/runtime/server.ts","../src/index.ts"],"names":["METADATA_KEYS"],"mappings":"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","file":"index.mjs","sourcesContent":["import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpServerMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpServer decorator\n */\nexport interface McpServerOptions {\n /**\n * Server name\n */\n name: string;\n\n /**\n * Server version (default: '1.0.0')\n */\n version?: string;\n\n /**\n * Server description\n */\n description?: string;\n}\n\n/**\n * Marks a class as an MCP server\n *\n * @example\n * ```typescript\n * @McpServer({ name: 'my-service', version: '1.0.0' })\n * export class MyController {\n * // ...\n * }\n * ```\n */\nexport function McpServer(options: McpServerOptions): ClassDecorator {\n return (target: Function) => {\n const metadata: McpServerMetadata = {\n name: options.name,\n version: options.version ?? '1.0.0',\n description: options.description,\n target,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.SERVER, metadata, target);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpToolMetadata, ToolInputSchema } from '@mcp-weave/core';\n\n/**\n * Options for @McpTool decorator\n */\nexport interface McpToolOptions {\n /**\n * Tool name\n */\n name: string;\n\n /**\n * Tool description\n */\n description: string;\n\n /**\n * Input schema (JSON Schema)\n */\n inputSchema?: ToolInputSchema;\n}\n\n/**\n * Marks a method as an MCP tool\n *\n * @example\n * ```typescript\n * @McpTool({\n * name: 'create_user',\n * description: 'Creates a new user'\n * })\n * async createUser(@McpInput() input: CreateUserDto) {\n * return { success: true };\n * }\n * ```\n */\nexport function McpTool(options: McpToolOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingTools: McpToolMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.TOOLS, constructor) ?? [];\n\n const metadata: McpToolMetadata = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.TOOLS, [...existingTools, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpResourceMetadata } from '@mcp-weave/core';\n\n/**\n * Options for @McpResource decorator\n */\nexport interface McpResourceOptions {\n /**\n * Resource URI template (e.g., 'user://{userId}')\n */\n uri: string;\n\n /**\n * Resource name\n */\n name: string;\n\n /**\n * Resource description\n */\n description?: string;\n\n /**\n * MIME type (default: 'application/json')\n */\n mimeType?: string;\n}\n\n/**\n * Marks a method as an MCP resource\n *\n * @example\n * ```typescript\n * @McpResource({\n * uri: 'user://{userId}',\n * name: 'User Profile',\n * mimeType: 'application/json'\n * })\n * async getUserProfile(@McpParam('userId') userId: string) {\n * return { contents: [...] };\n * }\n * ```\n */\nexport function McpResource(options: McpResourceOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingResources: McpResourceMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.RESOURCES, constructor) ?? [];\n\n const metadata: McpResourceMetadata = {\n uri: options.uri,\n name: options.name,\n description: options.description,\n mimeType: options.mimeType ?? 'application/json',\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.RESOURCES, [...existingResources, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpPromptMetadata, PromptArgument } from '@mcp-weave/core';\n\n/**\n * Options for @McpPrompt decorator\n */\nexport interface McpPromptOptions {\n /**\n * Prompt name\n */\n name: string;\n\n /**\n * Prompt description\n */\n description: string;\n\n /**\n * Prompt arguments\n */\n arguments?: PromptArgument[];\n}\n\n/**\n * Marks a method as an MCP prompt\n *\n * @example\n * ```typescript\n * @McpPrompt({\n * name: 'welcome_email',\n * description: 'Generate welcome email for new user'\n * })\n * async generateWelcomeEmail(\n * @McpPromptArg('userName') userName: string\n * ) {\n * return { messages: [...] };\n * }\n * ```\n */\nexport function McpPrompt(options: McpPromptOptions): MethodDecorator {\n return (target: object, propertyKey: string | symbol, _descriptor: PropertyDescriptor) => {\n const constructor = target.constructor;\n\n const existingPrompts: McpPromptMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PROMPTS, constructor) ?? [];\n\n const metadata: McpPromptMetadata = {\n name: options.name,\n description: options.description,\n arguments: options.arguments,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PROMPTS, [...existingPrompts, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport { METADATA_KEYS } from '@mcp-weave/core';\nimport type { McpParamMetadata } from '@mcp-weave/core';\n\n/**\n * Injects the tool input\n *\n * @example\n * ```typescript\n * @McpTool({ name: 'create_user', description: 'Creates a user' })\n * async createUser(@McpInput() input: CreateUserDto) {\n * // input contains the tool arguments\n * }\n * ```\n */\nexport function McpInput(): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'input',\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a URI parameter from a resource\n *\n * @example\n * ```typescript\n * @McpResource({ uri: 'user://{userId}', name: 'User' })\n * async getUser(@McpParam('userId') userId: string) {\n * // userId is extracted from the URI\n * }\n * ```\n */\nexport function McpParam(name: string): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'param',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n\n/**\n * Injects a prompt argument\n *\n * @example\n * ```typescript\n * @McpPrompt({ name: 'welcome', description: 'Welcome prompt' })\n * async generateWelcome(@McpPromptArg('userName') userName: string) {\n * // userName is the prompt argument\n * }\n * ```\n */\nexport function McpPromptArg(name: string): ParameterDecorator {\n return (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => {\n if (!propertyKey) return;\n\n const constructor = target.constructor;\n const existingParams: McpParamMetadata[] =\n Reflect.getMetadata(METADATA_KEYS.PARAMS, constructor) ?? [];\n\n const metadata: McpParamMetadata = {\n type: 'promptArg',\n name,\n parameterIndex,\n propertyKey,\n target: constructor,\n };\n\n Reflect.defineMetadata(METADATA_KEYS.PARAMS, [...existingParams, metadata], constructor);\n };\n}\n","import 'reflect-metadata';\nimport {\n METADATA_KEYS,\n extractMetadata,\n type ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n} from '@mcp-weave/core';\n\n// Re-export for convenience\nexport { METADATA_KEYS, extractMetadata };\nexport type {\n ScannedMetadata,\n McpServerMetadata,\n McpToolMetadata,\n McpResourceMetadata,\n McpPromptMetadata,\n McpParamMetadata,\n};\n\n/**\n * Check if a class has @McpServer decorator\n */\nexport function isMcpServer(target: Function): boolean {\n return Reflect.hasMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get all MCP servers from an array of classes\n */\nexport function getMcpServers(targets: Function[]): Function[] {\n return targets.filter(isMcpServer);\n}\n\n/**\n * Get server metadata from a class\n */\nexport function getServerMetadata(target: Function): McpServerMetadata | undefined {\n return Reflect.getMetadata(METADATA_KEYS.SERVER, target);\n}\n\n/**\n * Get tools metadata from a class\n */\nexport function getToolsMetadata(target: Function): McpToolMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.TOOLS, target) ?? [];\n}\n\n/**\n * Get resources metadata from a class\n */\nexport function getResourcesMetadata(target: Function): McpResourceMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.RESOURCES, target) ?? [];\n}\n\n/**\n * Get prompts metadata from a class\n */\nexport function getPromptsMetadata(target: Function): McpPromptMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PROMPTS, target) ?? [];\n}\n\n/**\n * Get params metadata from a class\n */\nexport function getParamsMetadata(target: Function): McpParamMetadata[] {\n return Reflect.getMetadata(METADATA_KEYS.PARAMS, target) ?? [];\n}\n","import { Server, StdioServerTransport, AnyObjectSchema } from './sdk-compat.js';\nimport { extractMetadata } from '../metadata/storage.js';\n\n/**\n * Options for MCP runtime server\n */\nexport interface McpRuntimeOptions {\n /**\n * Transport type\n */\n transport?: 'stdio' | 'sse';\n}\n\n/**\n * Runtime MCP server that wraps a decorated class\n */\nexport class McpRuntimeServer {\n private server: Server;\n private instance: unknown;\n private metadata;\n\n constructor(target: Function, _options: McpRuntimeOptions = {}) {\n this.metadata = extractMetadata(target);\n\n if (!this.metadata.server) {\n throw new Error(`Class ${target.name} is not decorated with @McpServer`);\n }\n\n this.server = new Server(\n {\n name: this.metadata.server.name,\n version: this.metadata.server.version ?? '1.0.0',\n },\n {\n capabilities: {\n tools: this.metadata.tools.length > 0 ? {} : undefined,\n resources: this.metadata.resources.length > 0 ? {} : undefined,\n prompts: this.metadata.prompts.length > 0 ? {} : undefined,\n },\n }\n );\n\n // Create instance of the target class\n this.instance = new (target as unknown as { new (): unknown })();\n\n this.setupHandlers();\n }\n\n private setupHandlers() {\n this.setupToolHandlers();\n this.setupResourceHandlers();\n this.setupPromptHandlers();\n }\n\n private setupToolHandlers() {\n const tools = this.metadata.tools;\n if (tools.length === 0) return;\n\n // List tools\n this.server.setRequestHandler(\n { method: 'tools/list' } as unknown as AnyObjectSchema,\n async () => ({\n tools: tools.map(tool => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema ?? { type: 'object' as const, properties: {} },\n })),\n })\n );\n\n // Call tool\n this.server.setRequestHandler(\n { method: 'tools/call' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const toolName = params.name as string;\n const tool = tools.find(t => t.name === toolName);\n if (!tool) {\n throw new Error(`Unknown tool: ${toolName}`);\n }\n const method = Reflect.get(this.instance as object, tool.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(tool.propertyKey)} not found`);\n }\n const args = this.resolveToolArgs(\n tool.propertyKey,\n (params.arguments ?? {}) as Record<string, unknown>\n );\n const result = await method.apply(this.instance as object, args);\n return {\n content: [\n {\n type: 'text',\n text: typeof result === 'string' ? result : JSON.stringify(result),\n },\n ],\n };\n }\n );\n }\n\n private setupResourceHandlers() {\n const resources = this.metadata.resources;\n if (resources.length === 0) return;\n\n // List resources\n this.server.setRequestHandler(\n { method: 'resources/list' } as unknown as AnyObjectSchema,\n async () => ({\n resources: resources.map(resource => ({\n uri: resource.uri,\n name: resource.name,\n description: resource.description,\n mimeType: resource.mimeType,\n })),\n })\n );\n\n // Read resource\n this.server.setRequestHandler(\n { method: 'resources/read' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const uri = params.uri as string;\n // Find matching resource\n for (const resource of resources) {\n const uriParams = this.extractUriParams(resource.uri, uri);\n if (uriParams) {\n const method = Reflect.get(this.instance as object, resource.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(resource.propertyKey)} not found`);\n }\n const args = this.resolveResourceArgs(resource.propertyKey, uriParams);\n return await method.apply(this.instance as object, args);\n }\n }\n throw new Error(`Resource not found: ${uri}`);\n }\n );\n }\n\n private setupPromptHandlers() {\n const prompts = this.metadata.prompts;\n if (prompts.length === 0) return;\n\n // List prompts\n this.server.setRequestHandler(\n { method: 'prompts/list' } as unknown as AnyObjectSchema,\n async () => ({\n prompts: prompts.map(prompt => ({\n name: prompt.name,\n description: prompt.description,\n arguments: prompt.arguments ?? [],\n })),\n })\n );\n\n // Get prompt\n this.server.setRequestHandler(\n { method: 'prompts/get' } as unknown as AnyObjectSchema,\n async (request: Record<string, unknown>) => {\n if (!request || typeof request !== 'object') throw new Error('Invalid request');\n const params = (request as { params?: Record<string, unknown> }).params;\n if (!params || typeof params !== 'object') throw new Error('Invalid params');\n const promptName = params.name as string;\n const prompt = prompts.find(p => p.name === promptName);\n if (!prompt) {\n throw new Error(`Unknown prompt: ${promptName}`);\n }\n const method = Reflect.get(this.instance as object, prompt.propertyKey);\n if (typeof method !== 'function') {\n throw new Error(`Method ${String(prompt.propertyKey)} not found`);\n }\n const args = this.resolvePromptArgs(\n prompt.propertyKey,\n (params.arguments ?? {}) as Record<string, unknown>\n );\n return await method.apply(this.instance as object, args);\n }\n );\n }\n\n private resolveToolArgs(propertyKey: string | symbol, input: Record<string, unknown>): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'input'\n );\n\n if (params.length === 0) {\n return [input];\n }\n\n const args: unknown[] = [];\n for (const param of params) {\n args[param.parameterIndex] = input;\n }\n return args;\n }\n\n private resolveResourceArgs(\n propertyKey: string | symbol,\n uriParams: Record<string, string>\n ): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'param'\n );\n\n const args: unknown[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = uriParams[param.name];\n }\n }\n return args;\n }\n\n private resolvePromptArgs(\n propertyKey: string | symbol,\n promptArgs: Record<string, unknown>\n ): unknown[] {\n const params = this.metadata.params.filter(\n p => p.propertyKey === propertyKey && p.type === 'promptArg'\n );\n\n const args: unknown[] = [];\n for (const param of params) {\n if (param.name) {\n args[param.parameterIndex] = promptArgs[param.name];\n }\n }\n return args;\n }\n\n private extractUriParams(template: string, uri: string): Record<string, string> | null {\n // Convert template to regex: user://{userId} -> user://([^/]+)\n const paramNames: string[] = [];\n const regexStr = template.replace(/\\{(\\w+)\\}/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n\n const regex = new RegExp(`^${regexStr}$`);\n const match = uri.match(regex);\n\n if (!match) return null;\n\n const params: Record<string, string> = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1] ?? '';\n });\n\n return params;\n }\n\n /**\n * Start the MCP server\n */\n async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n console.error(`MCP server '${this.metadata.server?.name}' started on stdio`);\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): Server {\n return this.server;\n }\n}\n\n/**\n * Create and start an MCP server from a decorated class\n */\nexport async function createMcpServer(\n target: Function,\n options?: McpRuntimeOptions\n): Promise<McpRuntimeServer> {\n const server = new McpRuntimeServer(target, options);\n await server.start();\n return server;\n}\n","// @mcp-weave/nestjs\n// NestJS integration for MCP-Weave\n\nimport 'reflect-metadata';\n\n// Decorators\nexport * from './decorators/mcp-server.js';\nexport * from './decorators/mcp-tool.js';\nexport * from './decorators/mcp-resource.js';\nexport * from './decorators/mcp-prompt.js';\nexport * from './decorators/params.js';\n\n// Metadata\nexport * from './metadata/storage.js';\n\n// Runtime\nexport * from './runtime/server.js';\n\n// Version\nexport const VERSION = '0.1.0';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-weave/nestjs",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "NestJS integration for MCP-Weave - decorators and runtime",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -18,7 +18,7 @@
18
18
  "dependencies": {
19
19
  "@modelcontextprotocol/sdk": "^1.0.0",
20
20
  "reflect-metadata": "^0.2.0",
21
- "@mcp-weave/core": "0.1.0"
21
+ "@mcp-weave/core": "0.1.1"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@nestjs/common": "^10.3.0",