@skillsmith/cli 0.2.3 → 0.2.4
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 +77 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/commands/author.d.ts +14 -1
- package/dist/src/commands/author.d.ts.map +1 -1
- package/dist/src/commands/author.js +174 -5
- package/dist/src/commands/author.js.map +1 -1
- package/dist/src/commands/index.d.ts +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +1 -1
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/templates/index.d.ts +1 -0
- package/dist/src/templates/index.d.ts.map +1 -1
- package/dist/src/templates/index.js +1 -0
- package/dist/src/templates/index.js.map +1 -1
- package/dist/src/templates/mcp-server.template.d.ts +97 -0
- package/dist/src/templates/mcp-server.template.d.ts.map +1 -0
- package/dist/src/templates/mcp-server.template.js +529 -0
- package/dist/src/templates/mcp-server.template.js.map +1 -0
- package/dist/tests/author.test.js +199 -0
- package/dist/tests/author.test.js.map +1 -1
- package/dist/tests/mcp-server-template.test.d.ts +7 -0
- package/dist/tests/mcp-server-template.test.d.ts.map +1 -0
- package/dist/tests/mcp-server-template.test.js +351 -0
- package/dist/tests/mcp-server-template.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-1433: MCP Server Template
|
|
3
|
+
*
|
|
4
|
+
* Templates for scaffolding TypeScript MCP servers with stdio transport.
|
|
5
|
+
* Generated servers are npx-ready and follow @modelcontextprotocol/sdk patterns.
|
|
6
|
+
*
|
|
7
|
+
* @example Basic Usage
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { renderMcpServerTemplates } from './mcp-server.template.js'
|
|
10
|
+
*
|
|
11
|
+
* const files = renderMcpServerTemplates({
|
|
12
|
+
* name: 'my-mcp-server',
|
|
13
|
+
* description: 'Does cool things',
|
|
14
|
+
* author: 'developer',
|
|
15
|
+
* tools: []
|
|
16
|
+
* })
|
|
17
|
+
*
|
|
18
|
+
* // files is a Map<string, string> of file paths to content
|
|
19
|
+
* // Keys: package.json, tsconfig.json, src/index.ts, src/server.ts,
|
|
20
|
+
* // src/tools/index.ts, src/tools/example.ts, README.md, .gitignore
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @example With Custom Tools
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const files = renderMcpServerTemplates({
|
|
26
|
+
* name: 'slack-mcp',
|
|
27
|
+
* description: 'Slack integration MCP server',
|
|
28
|
+
* author: 'team',
|
|
29
|
+
* tools: [
|
|
30
|
+
* {
|
|
31
|
+
* name: 'send_message',
|
|
32
|
+
* description: 'Send a Slack message',
|
|
33
|
+
* parameters: [
|
|
34
|
+
* { name: 'channel', type: 'string', description: 'Channel ID', required: true },
|
|
35
|
+
* { name: 'text', type: 'string', description: 'Message text', required: true }
|
|
36
|
+
* ]
|
|
37
|
+
* }
|
|
38
|
+
* ]
|
|
39
|
+
* })
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @module mcp-server-template
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Dependency version constants for easier maintenance
|
|
46
|
+
*/
|
|
47
|
+
const VERSIONS = {
|
|
48
|
+
MCP_SDK: '^1.0.0',
|
|
49
|
+
TYPES_NODE: '^20.0.0',
|
|
50
|
+
TSX: '^4.0.0',
|
|
51
|
+
TYPESCRIPT: '^5.0.0',
|
|
52
|
+
NODE_ENGINE: '>=18.0.0',
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* package.json template for MCP server
|
|
56
|
+
*/
|
|
57
|
+
export const PACKAGE_JSON_TEMPLATE = `{
|
|
58
|
+
"name": "{{name}}",
|
|
59
|
+
"version": "0.1.0",
|
|
60
|
+
"description": "{{description}}",
|
|
61
|
+
"type": "module",
|
|
62
|
+
"main": "dist/index.js",
|
|
63
|
+
"bin": {
|
|
64
|
+
"{{name}}": "./dist/index.js"
|
|
65
|
+
},
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "tsc",
|
|
68
|
+
"start": "node dist/index.js",
|
|
69
|
+
"dev": "tsx src/index.ts",
|
|
70
|
+
"watch": "tsc --watch",
|
|
71
|
+
"prepublishOnly": "npm run build"
|
|
72
|
+
},
|
|
73
|
+
"keywords": [
|
|
74
|
+
"mcp",
|
|
75
|
+
"mcp-server",
|
|
76
|
+
"claude",
|
|
77
|
+
"ai"
|
|
78
|
+
],
|
|
79
|
+
"author": "{{author}}",
|
|
80
|
+
"license": "MIT",
|
|
81
|
+
"dependencies": {
|
|
82
|
+
"@modelcontextprotocol/sdk": "${VERSIONS.MCP_SDK}"
|
|
83
|
+
},
|
|
84
|
+
"devDependencies": {
|
|
85
|
+
"@types/node": "${VERSIONS.TYPES_NODE}",
|
|
86
|
+
"tsx": "${VERSIONS.TSX}",
|
|
87
|
+
"typescript": "${VERSIONS.TYPESCRIPT}"
|
|
88
|
+
},
|
|
89
|
+
"engines": {
|
|
90
|
+
"node": "${VERSIONS.NODE_ENGINE}"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
`;
|
|
94
|
+
/**
|
|
95
|
+
* tsconfig.json template for MCP server
|
|
96
|
+
*/
|
|
97
|
+
export const TSCONFIG_JSON_TEMPLATE = `{
|
|
98
|
+
"compilerOptions": {
|
|
99
|
+
"target": "ES2022",
|
|
100
|
+
"module": "NodeNext",
|
|
101
|
+
"moduleResolution": "NodeNext",
|
|
102
|
+
"lib": ["ES2022"],
|
|
103
|
+
"outDir": "./dist",
|
|
104
|
+
"rootDir": "./src",
|
|
105
|
+
"strict": true,
|
|
106
|
+
"esModuleInterop": true,
|
|
107
|
+
"skipLibCheck": true,
|
|
108
|
+
"forceConsistentCasingInFileNames": true,
|
|
109
|
+
"declaration": true,
|
|
110
|
+
"declarationMap": true,
|
|
111
|
+
"sourceMap": true
|
|
112
|
+
},
|
|
113
|
+
"include": ["src/**/*"],
|
|
114
|
+
"exclude": ["node_modules", "dist"]
|
|
115
|
+
}
|
|
116
|
+
`;
|
|
117
|
+
/**
|
|
118
|
+
* Main entry point (src/index.ts) template
|
|
119
|
+
*/
|
|
120
|
+
export const INDEX_TS_TEMPLATE = `#!/usr/bin/env node
|
|
121
|
+
/**
|
|
122
|
+
* {{name}} - MCP Server
|
|
123
|
+
*
|
|
124
|
+
* {{description}}
|
|
125
|
+
*/
|
|
126
|
+
|
|
127
|
+
import { createServer, createTransport } from './server.js'
|
|
128
|
+
|
|
129
|
+
async function main(): Promise<void> {
|
|
130
|
+
const server = createServer()
|
|
131
|
+
const transport = createTransport()
|
|
132
|
+
await server.connect(transport)
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
main().catch((error) => {
|
|
136
|
+
console.error('Server error:', error)
|
|
137
|
+
process.exit(1)
|
|
138
|
+
})
|
|
139
|
+
`;
|
|
140
|
+
/**
|
|
141
|
+
* Server setup (src/server.ts) template
|
|
142
|
+
*/
|
|
143
|
+
export const SERVER_TS_TEMPLATE = `/**
|
|
144
|
+
* MCP Server Configuration
|
|
145
|
+
*
|
|
146
|
+
* Sets up the MCP server with tool handlers.
|
|
147
|
+
*/
|
|
148
|
+
|
|
149
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js'
|
|
150
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
151
|
+
import {
|
|
152
|
+
CallToolRequestSchema,
|
|
153
|
+
ListToolsRequestSchema,
|
|
154
|
+
} from '@modelcontextprotocol/sdk/types.js'
|
|
155
|
+
|
|
156
|
+
import { tools, handleToolCall } from './tools/index.js'
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Create and configure the MCP server
|
|
160
|
+
*/
|
|
161
|
+
export function createServer(): Server {
|
|
162
|
+
const server = new Server(
|
|
163
|
+
{
|
|
164
|
+
name: '{{name}}',
|
|
165
|
+
version: '0.1.0',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
capabilities: {
|
|
169
|
+
tools: {},
|
|
170
|
+
},
|
|
171
|
+
}
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
// Register tool listing handler
|
|
175
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
176
|
+
return { tools }
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
// Register tool execution handler
|
|
180
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
181
|
+
const { name, arguments: args } = request.params
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
const result = await handleToolCall(name, args || {})
|
|
185
|
+
return {
|
|
186
|
+
content: [
|
|
187
|
+
{
|
|
188
|
+
type: 'text',
|
|
189
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
}
|
|
193
|
+
} catch (error) {
|
|
194
|
+
const message = error instanceof Error ? error.message : 'Unknown error'
|
|
195
|
+
return {
|
|
196
|
+
content: [{ type: 'text', text: \`Error: \${message}\` }],
|
|
197
|
+
isError: true,
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
return server
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Create a stdio transport for the server
|
|
207
|
+
*/
|
|
208
|
+
export function createTransport(): StdioServerTransport {
|
|
209
|
+
return new StdioServerTransport()
|
|
210
|
+
}
|
|
211
|
+
`;
|
|
212
|
+
/**
|
|
213
|
+
* Tools index (src/tools/index.ts) template
|
|
214
|
+
*/
|
|
215
|
+
export const TOOLS_INDEX_TS_TEMPLATE = `/**
|
|
216
|
+
* Tool Definitions and Handlers
|
|
217
|
+
*
|
|
218
|
+
* Register your MCP tools here.
|
|
219
|
+
*/
|
|
220
|
+
|
|
221
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js'
|
|
222
|
+
{{toolImports}}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Tool definitions exposed by this MCP server
|
|
226
|
+
*/
|
|
227
|
+
export const tools: Tool[] = [
|
|
228
|
+
{{toolDefinitions}}
|
|
229
|
+
]
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Route tool calls to appropriate handlers
|
|
233
|
+
*/
|
|
234
|
+
export async function handleToolCall(
|
|
235
|
+
name: string,
|
|
236
|
+
args: Record<string, unknown>
|
|
237
|
+
): Promise<unknown> {
|
|
238
|
+
switch (name) {
|
|
239
|
+
{{toolCases}}
|
|
240
|
+
default:
|
|
241
|
+
throw new Error(\`Unknown tool: \${name}\`)
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
`;
|
|
245
|
+
/**
|
|
246
|
+
* Example tool implementation template
|
|
247
|
+
*/
|
|
248
|
+
export const EXAMPLE_TOOL_TS_TEMPLATE = `/**
|
|
249
|
+
* Example Tool Implementation
|
|
250
|
+
*
|
|
251
|
+
* This is a sample tool to demonstrate the pattern.
|
|
252
|
+
* Replace with your actual tool logic.
|
|
253
|
+
*/
|
|
254
|
+
|
|
255
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js'
|
|
256
|
+
|
|
257
|
+
export const exampleToolDefinition: Tool = {
|
|
258
|
+
name: 'example',
|
|
259
|
+
description: 'An example tool that echoes input',
|
|
260
|
+
inputSchema: {
|
|
261
|
+
type: 'object',
|
|
262
|
+
properties: {
|
|
263
|
+
message: {
|
|
264
|
+
type: 'string',
|
|
265
|
+
description: 'Message to echo back',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
required: ['message'],
|
|
269
|
+
},
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export interface ExampleToolArgs {
|
|
273
|
+
message: string
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
export async function handleExampleTool(args: ExampleToolArgs): Promise<string> {
|
|
277
|
+
return \`Echo: \${args.message}\`
|
|
278
|
+
}
|
|
279
|
+
`;
|
|
280
|
+
/**
|
|
281
|
+
* README.md template for MCP server
|
|
282
|
+
*/
|
|
283
|
+
export const MCP_README_TEMPLATE = `# {{name}}
|
|
284
|
+
|
|
285
|
+
{{description}}
|
|
286
|
+
|
|
287
|
+
## Installation
|
|
288
|
+
|
|
289
|
+
\`\`\`bash
|
|
290
|
+
npm install -g {{name}}
|
|
291
|
+
\`\`\`
|
|
292
|
+
|
|
293
|
+
Or use directly with npx:
|
|
294
|
+
|
|
295
|
+
\`\`\`bash
|
|
296
|
+
npx {{name}}
|
|
297
|
+
\`\`\`
|
|
298
|
+
|
|
299
|
+
## Configuration
|
|
300
|
+
|
|
301
|
+
Add to your Claude configuration (\`~/.claude/settings.json\`):
|
|
302
|
+
|
|
303
|
+
\`\`\`json
|
|
304
|
+
{
|
|
305
|
+
"mcpServers": {
|
|
306
|
+
"{{name}}": {
|
|
307
|
+
"command": "npx",
|
|
308
|
+
"args": ["-y", "{{name}}"]
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
\`\`\`
|
|
313
|
+
|
|
314
|
+
## Available Tools
|
|
315
|
+
|
|
316
|
+
{{toolDocs}}
|
|
317
|
+
|
|
318
|
+
## Development
|
|
319
|
+
|
|
320
|
+
\`\`\`bash
|
|
321
|
+
# Install dependencies
|
|
322
|
+
npm install
|
|
323
|
+
|
|
324
|
+
# Run in development mode
|
|
325
|
+
npm run dev
|
|
326
|
+
|
|
327
|
+
# Build for production
|
|
328
|
+
npm run build
|
|
329
|
+
|
|
330
|
+
# Run production build
|
|
331
|
+
npm start
|
|
332
|
+
\`\`\`
|
|
333
|
+
|
|
334
|
+
## License
|
|
335
|
+
|
|
336
|
+
MIT
|
|
337
|
+
`;
|
|
338
|
+
/**
|
|
339
|
+
* .gitignore template for MCP server
|
|
340
|
+
*/
|
|
341
|
+
export const MCP_GITIGNORE_TEMPLATE = `# Dependencies
|
|
342
|
+
node_modules/
|
|
343
|
+
|
|
344
|
+
# Build output
|
|
345
|
+
dist/
|
|
346
|
+
|
|
347
|
+
# Environment
|
|
348
|
+
.env
|
|
349
|
+
.env.local
|
|
350
|
+
.env.*.local
|
|
351
|
+
|
|
352
|
+
# IDE
|
|
353
|
+
.idea/
|
|
354
|
+
.vscode/
|
|
355
|
+
*.swp
|
|
356
|
+
*.swo
|
|
357
|
+
|
|
358
|
+
# OS
|
|
359
|
+
.DS_Store
|
|
360
|
+
Thumbs.db
|
|
361
|
+
|
|
362
|
+
# Logs
|
|
363
|
+
*.log
|
|
364
|
+
npm-debug.log*
|
|
365
|
+
|
|
366
|
+
# Test coverage
|
|
367
|
+
coverage/
|
|
368
|
+
`;
|
|
369
|
+
/**
|
|
370
|
+
* Escape single quotes in strings for safe template interpolation
|
|
371
|
+
*/
|
|
372
|
+
function escapeQuotes(str) {
|
|
373
|
+
return str.replace(/'/g, "\\'");
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Generate tool definition code for a single tool
|
|
377
|
+
*/
|
|
378
|
+
function generateToolDefinition(tool, indent = ' ') {
|
|
379
|
+
const properties = [];
|
|
380
|
+
const required = [];
|
|
381
|
+
for (const param of tool.parameters || []) {
|
|
382
|
+
properties.push(`${indent} ${param.name}: {
|
|
383
|
+
${indent} type: '${param.type}',
|
|
384
|
+
${indent} description: '${escapeQuotes(param.description)}',
|
|
385
|
+
${indent} },`);
|
|
386
|
+
if (param.required) {
|
|
387
|
+
required.push(`'${param.name}'`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const propertiesStr = properties.length > 0 ? properties.join('\n') : '';
|
|
391
|
+
const requiredStr = required.length > 0 ? `\n${indent} required: [${required.join(', ')}],` : '';
|
|
392
|
+
return `${indent}{
|
|
393
|
+
${indent} name: '${escapeQuotes(tool.name)}',
|
|
394
|
+
${indent} description: '${escapeQuotes(tool.description)}',
|
|
395
|
+
${indent} inputSchema: {
|
|
396
|
+
${indent} type: 'object',
|
|
397
|
+
${indent} properties: {
|
|
398
|
+
${propertiesStr}
|
|
399
|
+
${indent} },${requiredStr}
|
|
400
|
+
${indent} },
|
|
401
|
+
${indent}},`;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Generate tool handler case for switch statement
|
|
405
|
+
*/
|
|
406
|
+
function generateToolCase(tool) {
|
|
407
|
+
const handlerName = `handle${tool.name.charAt(0).toUpperCase()}${tool.name.slice(1).replace(/-/g, '')}Tool`;
|
|
408
|
+
const argsType = `${tool.name.charAt(0).toUpperCase()}${tool.name.slice(1).replace(/-/g, '')}ToolArgs`;
|
|
409
|
+
return ` case '${tool.name}':
|
|
410
|
+
return ${handlerName}(args as unknown as ${argsType})`;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Generate tool import statement
|
|
414
|
+
*/
|
|
415
|
+
function generateToolImport(tool) {
|
|
416
|
+
const baseName = tool.name.charAt(0).toUpperCase() + tool.name.slice(1).replace(/-/g, '');
|
|
417
|
+
return `import { handle${baseName}Tool, type ${baseName}ToolArgs } from './${tool.name}.js'`;
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Generate a stub implementation file for a custom tool
|
|
421
|
+
*/
|
|
422
|
+
function generateToolImplementation(tool) {
|
|
423
|
+
const baseName = tool.name.charAt(0).toUpperCase() + tool.name.slice(1).replace(/-/g, '');
|
|
424
|
+
const params = tool.parameters || [];
|
|
425
|
+
// Generate TypeScript interface properties
|
|
426
|
+
const interfaceProps = params
|
|
427
|
+
.map((p) => {
|
|
428
|
+
const tsType = p.type === 'array' ? 'unknown[]' : p.type === 'object' ? 'Record<string, unknown>' : p.type;
|
|
429
|
+
return ` ${p.name}${p.required ? '' : '?'}: ${tsType}`;
|
|
430
|
+
})
|
|
431
|
+
.join('\n');
|
|
432
|
+
// Generate implementation placeholder
|
|
433
|
+
const returnPlaceholder = params.length > 0
|
|
434
|
+
? `\`${tool.name} called with: \${JSON.stringify({ ${params.map((p) => `${p.name}: args.${p.name}`).join(', ')} })}\``
|
|
435
|
+
: `'${tool.name} called'`;
|
|
436
|
+
return `/**
|
|
437
|
+
* ${baseName} Tool Implementation
|
|
438
|
+
*
|
|
439
|
+
* ${escapeQuotes(tool.description)}
|
|
440
|
+
* TODO: Implement your tool logic here.
|
|
441
|
+
*/
|
|
442
|
+
|
|
443
|
+
export interface ${baseName}ToolArgs {
|
|
444
|
+
${interfaceProps || ' // No parameters'}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export async function handle${baseName}Tool(args: ${baseName}ToolArgs): Promise<string> {
|
|
448
|
+
// TODO: Implement ${tool.name} logic
|
|
449
|
+
return ${returnPlaceholder}
|
|
450
|
+
}
|
|
451
|
+
`;
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Generate tool documentation for README
|
|
455
|
+
*/
|
|
456
|
+
function generateToolDocs(tools) {
|
|
457
|
+
if (tools.length === 0) {
|
|
458
|
+
return '- `example` - An example tool that echoes input';
|
|
459
|
+
}
|
|
460
|
+
return tools
|
|
461
|
+
.map((tool) => {
|
|
462
|
+
const params = tool.parameters?.map((p) => `\`${p.name}\``).join(', ') || 'none';
|
|
463
|
+
return `- \`${tool.name}\` - ${tool.description}\n - Parameters: ${params}`;
|
|
464
|
+
})
|
|
465
|
+
.join('\n');
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* Render MCP server templates
|
|
469
|
+
*/
|
|
470
|
+
export function renderMcpServerTemplates(data) {
|
|
471
|
+
const files = new Map();
|
|
472
|
+
// Use example tool if no tools specified
|
|
473
|
+
const toolsToUse = data.tools.length > 0
|
|
474
|
+
? data.tools
|
|
475
|
+
: [
|
|
476
|
+
{
|
|
477
|
+
name: 'example',
|
|
478
|
+
description: 'An example tool that echoes input',
|
|
479
|
+
parameters: [
|
|
480
|
+
{
|
|
481
|
+
name: 'message',
|
|
482
|
+
type: 'string',
|
|
483
|
+
description: 'Message to echo back',
|
|
484
|
+
required: true,
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
},
|
|
488
|
+
];
|
|
489
|
+
// Generate tool-specific code
|
|
490
|
+
const toolImports = toolsToUse.map(generateToolImport).join('\n');
|
|
491
|
+
const toolDefinitions = toolsToUse.map((t) => generateToolDefinition(t)).join('\n');
|
|
492
|
+
const toolCases = toolsToUse.map(generateToolCase).join('\n');
|
|
493
|
+
const toolDocs = generateToolDocs(data.tools);
|
|
494
|
+
// package.json
|
|
495
|
+
files.set('package.json', PACKAGE_JSON_TEMPLATE.replace(/\{\{name\}\}/g, data.name)
|
|
496
|
+
.replace(/\{\{description\}\}/g, data.description)
|
|
497
|
+
.replace(/\{\{author\}\}/g, data.author));
|
|
498
|
+
// tsconfig.json
|
|
499
|
+
files.set('tsconfig.json', TSCONFIG_JSON_TEMPLATE);
|
|
500
|
+
// src/index.ts
|
|
501
|
+
files.set('src/index.ts', INDEX_TS_TEMPLATE.replace(/\{\{name\}\}/g, data.name).replace(/\{\{description\}\}/g, data.description));
|
|
502
|
+
// src/server.ts
|
|
503
|
+
files.set('src/server.ts', SERVER_TS_TEMPLATE.replace(/\{\{name\}\}/g, data.name));
|
|
504
|
+
// src/tools/index.ts
|
|
505
|
+
files.set('src/tools/index.ts', TOOLS_INDEX_TS_TEMPLATE.replace(/\{\{toolImports\}\}/g, toolImports)
|
|
506
|
+
.replace(/\{\{toolDefinitions\}\}/g, toolDefinitions)
|
|
507
|
+
.replace(/\{\{toolCases\}\}/g, toolCases));
|
|
508
|
+
// Generate tool implementation files
|
|
509
|
+
if (data.tools.length > 0) {
|
|
510
|
+
// Generate stub implementations for custom tools
|
|
511
|
+
for (const tool of data.tools) {
|
|
512
|
+
files.set(`src/tools/${tool.name}.ts`, generateToolImplementation(tool));
|
|
513
|
+
}
|
|
514
|
+
// Include example.ts as reference
|
|
515
|
+
files.set('src/tools/example.ts', EXAMPLE_TOOL_TS_TEMPLATE);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
// No custom tools - just use example tool (already imported in index.ts)
|
|
519
|
+
files.set('src/tools/example.ts', EXAMPLE_TOOL_TS_TEMPLATE);
|
|
520
|
+
}
|
|
521
|
+
// README.md
|
|
522
|
+
files.set('README.md', MCP_README_TEMPLATE.replace(/\{\{name\}\}/g, data.name)
|
|
523
|
+
.replace(/\{\{description\}\}/g, data.description)
|
|
524
|
+
.replace(/\{\{toolDocs\}\}/g, toolDocs));
|
|
525
|
+
// .gitignore
|
|
526
|
+
files.set('.gitignore', MCP_GITIGNORE_TEMPLATE);
|
|
527
|
+
return files;
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=mcp-server.template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.template.js","sourceRoot":"","sources":["../../../src/templates/mcp-server.template.ts"],"names":[],"mappings":"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"}
|