@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 +246 -0
- package/dist/index.js +101 -66
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +101 -66
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
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(
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
throw new Error(
|
|
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
|
-
|
|
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(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
throw new Error(
|
|
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
|
-
|
|
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(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
throw new Error(
|
|
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
|
-
|
|
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(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
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(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
throw new Error(
|
|
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
|
-
|
|
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(
|
package/dist/index.mjs.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"],"mappings":";;;;;;;AAmCO,SAAS,UAAU,OAAA,EAA2C;AACnE,EAAA,OAAO,CAAC,MAAA,KAAqB;AAC3B,IAAA,MAAM,QAAA,GAA8B;AAAA,MAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS,QAAQ,OAAA,IAAW,OAAA;AAAA,MAC5B,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB;AAAA,KACF;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAe,aAAA,CAAc,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EAC/D,CAAA;AACF;ACRO,SAAS,QAAQ,OAAA,EAA0C;AAChE,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA8B,WAAA,KAAoC;AACxF,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,MAAM,gBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,KAAA,EAAO,WAAW,KAAK,EAAC;AAE5D,IAAA,MAAM,QAAA,GAA4B;AAAA,MAChC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,KAAA,EAAO,CAAC,GAAG,aAAA,EAAe,QAAQ,GAAG,WAAW,CAAA;AAAA,EACvF,CAAA;AACF;ACXO,SAAS,YAAY,OAAA,EAA8C;AACxE,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA8B,WAAA,KAAoC;AACxF,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,MAAM,oBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,SAAA,EAAW,WAAW,KAAK,EAAC;AAEhE,IAAA,MAAM,QAAA,GAAgC;AAAA,MACpC,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,QAAA,EAAU,QAAQ,QAAA,IAAY,kBAAA;AAAA,MAC9B,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,SAAA,EAAW,CAAC,GAAG,iBAAA,EAAmB,QAAQ,GAAG,WAAW,CAAA;AAAA,EAC/F,CAAA;AACF;ACtBO,SAAS,UAAU,OAAA,EAA4C;AACpE,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA8B,WAAA,KAAoC;AACxF,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAE3B,IAAA,MAAM,kBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,OAAA,EAAS,WAAW,KAAK,EAAC;AAE9D,IAAA,MAAM,QAAA,GAA8B;AAAA,MAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,OAAA,EAAS,CAAC,GAAG,eAAA,EAAiB,QAAQ,GAAG,WAAW,CAAA;AAAA,EAC3F,CAAA;AACF;AC1CO,SAAS,QAAA,GAA+B;AAC7C,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA0C,cAAA,KAA2B;AAC3F,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,iBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,MAAA,EAAQ,WAAW,KAAK,EAAC;AAE7D,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,cAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,MAAA,EAAQ,CAAC,GAAG,cAAA,EAAgB,QAAQ,GAAG,WAAW,CAAA;AAAA,EACzF,CAAA;AACF;AAaO,SAAS,SAAS,IAAA,EAAkC;AACzD,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA0C,cAAA,KAA2B;AAC3F,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,iBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,MAAA,EAAQ,WAAW,KAAK,EAAC;AAE7D,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,OAAA;AAAA,MACN,IAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,MAAA,EAAQ,CAAC,GAAG,cAAA,EAAgB,QAAQ,GAAG,WAAW,CAAA;AAAA,EACzF,CAAA;AACF;AAaO,SAAS,aAAa,IAAA,EAAkC;AAC7D,EAAA,OAAO,CAAC,MAAA,EAAgB,WAAA,EAA0C,cAAA,KAA2B;AAC3F,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,IAAA,MAAM,iBACJ,OAAA,CAAQ,WAAA,CAAYA,cAAc,MAAA,EAAQ,WAAW,KAAK,EAAC;AAE7D,IAAA,MAAM,QAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAA,CAAQ,cAAA,CAAeA,cAAc,MAAA,EAAQ,CAAC,GAAG,cAAA,EAAgB,QAAQ,GAAG,WAAW,CAAA;AAAA,EACzF,CAAA;AACF;ACtEO,SAAS,YAAY,MAAA,EAA2B;AACrD,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAYA,aAAAA,CAAc,MAAA,EAAQ,MAAM,CAAA;AACzD;AAKO,SAAS,cAAc,OAAA,EAAiC;AAC7D,EAAA,OAAO,OAAA,CAAQ,OAAO,WAAW,CAAA;AACnC;AAKO,SAAS,kBAAkB,MAAA,EAAiD;AACjF,EAAA,OAAO,OAAA,CAAQ,WAAA,CAAYA,aAAAA,CAAc,MAAA,EAAQ,MAAM,CAAA;AACzD;AAKO,SAAS,iBAAiB,MAAA,EAAqC;AACpE,EAAA,OAAO,QAAQ,WAAA,CAAYA,aAAAA,CAAc,KAAA,EAAO,MAAM,KAAK,EAAC;AAC9D;AAKO,SAAS,qBAAqB,MAAA,EAAyC;AAC5E,EAAA,OAAO,QAAQ,WAAA,CAAYA,aAAAA,CAAc,SAAA,EAAW,MAAM,KAAK,EAAC;AAClE;AAKO,SAAS,mBAAmB,MAAA,EAAuC;AACxE,EAAA,OAAO,QAAQ,WAAA,CAAYA,aAAAA,CAAc,OAAA,EAAS,MAAM,KAAK,EAAC;AAChE;AAKO,SAAS,kBAAkB,MAAA,EAAsC;AACtE,EAAA,OAAO,QAAQ,WAAA,CAAYA,aAAAA,CAAc,MAAA,EAAQ,MAAM,KAAK,EAAC;AAC/D;AClDO,IAAM,mBAAN,MAAuB;AAAA,EACpB,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EAER,WAAA,CAAY,MAAA,EAAkB,QAAA,GAA8B,EAAC,EAAG;AAC9D,IAAA,IAAA,CAAK,QAAA,GAAW,gBAAgB,MAAM,CAAA;AAEtC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,IACzE;AAEA,IAAA,IAAA,CAAK,SAAS,IAAI,MAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,IAAA;AAAA,QAC3B,OAAA,EAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAA,IAAW;AAAA,OAC3C;AAAA,MACA;AAAA,QACE,YAAA,EAAc;AAAA,UACZ,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,MAAA,GAAS,CAAA,GAAI,EAAC,GAAI,MAAA;AAAA,UAC7C,WAAW,IAAA,CAAK,QAAA,CAAS,UAAU,MAAA,GAAS,CAAA,GAAI,EAAC,GAAI,MAAA;AAAA,UACrD,SAAS,IAAA,CAAK,QAAA,CAAS,QAAQ,MAAA,GAAS,CAAA,GAAI,EAAC,GAAI;AAAA;AACnD;AACF,KACF;AAGA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAK,MAAA,EAAe;AAEpC,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACrB;AAAA,EAEQ,aAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA,EAEQ,iBAAA,GAAoB;AAC1B,IAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,CAAS,KAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAGxB,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,MAAA,EAAQ,YAAA,IAAuB,aAAa;AAAA,MAC1E,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,QACxB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAA,EAAa,KAAK,WAAA,IAAe,EAAE,MAAM,QAAA,EAAmB,UAAA,EAAY,EAAC;AAAE,OAC7E,CAAE;AAAA,KACJ,CAAE,CAAA;AAGF,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,QAAQ,YAAA,EAAa,EAAU,OAAO,OAAA,KAAiB;AACrF,MAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CAAO,IAAA;AAChC,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAEhD,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,WAAW,CAAA;AAC7C,MAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,IAAA,CAAK,WAAW,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,MAChE;AAEA,MAAA,MAAM,IAAA,GAAO,KAAK,eAAA,CAAgB,IAAA,CAAK,aAAa,OAAA,CAAQ,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AAClF,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,UAAU,IAAI,CAAA;AAErD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,MAAA;AAAA,YACN,MAAM,OAAO,MAAA,KAAW,WAAW,MAAA,GAAS,IAAA,CAAK,UAAU,MAAM;AAAA;AACnE;AACF,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,qBAAA,GAAwB;AAC9B,IAAA,MAAM,SAAA,GAAY,KAAK,QAAA,CAAS,SAAA;AAChC,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAG5B,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,MAAA,EAAQ,gBAAA,IAA2B,aAAa;AAAA,MAC9E,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,CAAA,QAAA,MAAa;AAAA,QACpC,KAAK,QAAA,CAAS,GAAA;AAAA,QACd,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,aAAa,QAAA,CAAS,WAAA;AAAA,QACtB,UAAU,QAAA,CAAS;AAAA,OACrB,CAAE;AAAA,KACJ,CAAE,CAAA;AAGF,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,QAAQ,gBAAA,EAAiB,EAAU,OAAO,OAAA,KAAiB;AACzF,MAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,GAAA;AAG3B,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,QAAA,CAAS,KAAK,GAAG,CAAA;AACtD,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA;AACjD,UAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,QAAA,CAAS,WAAW,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,UACpE;AAEA,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,mBAAA,CAAoB,QAAA,CAAS,aAAa,MAAM,CAAA;AAClE,UAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,QAC/C;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,mBAAA,GAAsB;AAC5B,IAAA,MAAM,OAAA,GAAU,KAAK,QAAA,CAAS,OAAA;AAC9B,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAG1B,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,MAAA,EAAQ,cAAA,IAAyB,aAAa;AAAA,MAC5E,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,QAC9B,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAA,EAAW,MAAA,CAAO,SAAA,IAAa;AAAC,OAClC,CAAE;AAAA,KACJ,CAAE,CAAA;AAGF,IAAA,IAAA,CAAK,OAAO,iBAAA,CAAkB,EAAE,QAAQ,aAAA,EAAc,EAAU,OAAO,OAAA,KAAiB;AACtF,MAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,IAAA;AAClC,MAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AAEtD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AAC/C,MAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,OAAA,EAAU,OAAO,MAAA,CAAO,WAAW,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,MAClE;AAEA,MAAA,MAAM,IAAA,GAAO,KAAK,iBAAA,CAAkB,MAAA,CAAO,aAAa,OAAA,CAAQ,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AACtF,MAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,eAAA,CAAgB,aAA8B,KAAA,EAAmC;AACvF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAA;AAAA,MAClC,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,KAAgB,WAAA,IAAe,EAAE,IAAA,KAAS;AAAA,KACnD;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,CAAC,KAAK,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA,GAAI,KAAA;AAAA,IAC/B;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,mBAAA,CACN,aACA,SAAA,EACO;AACP,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAA;AAAA,MAClC,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,KAAgB,WAAA,IAAe,EAAE,IAAA,KAAS;AAAA,KACnD;AAEA,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA,GAAI,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,MACnD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,iBAAA,CAAkB,aAA8B,UAAA,EAAwC;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAA;AAAA,MAClC,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,KAAgB,WAAA,IAAe,EAAE,IAAA,KAAS;AAAA,KACnD;AAEA,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA,GAAI,UAAA,CAAW,MAAM,IAAI,CAAA;AAAA,MACpD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,CAAiB,UAAkB,GAAA,EAA4C;AAErF,IAAA,MAAM,aAAuB,EAAC;AAC9B,IAAA,MAAM,WAAW,QAAA,CAAS,OAAA,CAAQ,YAAA,EAAc,CAAC,GAAG,IAAA,KAAS;AAC3D,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AACpB,MAAA,OAAO,SAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAE7B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAClC,MAAA,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,EAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AACnC,IAAA,OAAA,CAAQ,MAAM,CAAA,YAAA,EAAe,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA,kBAAA,CAAoB,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AACF;AAKA,eAAsB,eAAA,CACpB,QACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAiB,MAAA,EAAQ,OAAO,CAAA;AACnD,EAAA,MAAM,OAAO,KAAA,EAAM;AACnB,EAAA,OAAO,MAAA;AACT;;;ACjPO,IAAM,OAAA,GAAU","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.
|
|
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.
|
|
21
|
+
"@mcp-weave/core": "0.1.1"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@nestjs/common": "^10.3.0",
|