@mr-aftab-ahmad-khan/create-mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +15 -0
- package/README.md +329 -0
- package/dist/chunk-DPHSIP3N.js +733 -0
- package/dist/chunk-DPHSIP3N.js.map +1 -0
- package/dist/cli.cjs +802 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.cjs +760 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +30 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/scaffold.ts","../src/templates/common.ts","../src/templates/blank.ts","../src/templates/postgres.ts","../src/templates/stripe.ts","../src/templates/filesystem.ts","../src/templates/rest.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync, readdirSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport type { ScaffoldOptions, TemplateDescriptor } from \"./types.js\";\nimport { blankTemplate } from \"./templates/blank.js\";\nimport { postgresTemplate } from \"./templates/postgres.js\";\nimport { stripeTemplate } from \"./templates/stripe.js\";\nimport { filesystemTemplate } from \"./templates/filesystem.js\";\nimport { restTemplate } from \"./templates/rest.js\";\n\nexport const TEMPLATES: Record<string, TemplateDescriptor> = {\n blank: blankTemplate,\n postgres: postgresTemplate,\n stripe: stripeTemplate,\n filesystem: filesystemTemplate,\n rest: restTemplate,\n};\n\nexport function scaffold(opts: ScaffoldOptions): string {\n const tpl = TEMPLATES[opts.template];\n if (!tpl) throw new Error(`Unknown template: ${opts.template}`);\n const target = resolve(opts.target ?? opts.name);\n if (existsSync(target) && readdirSync(target).length > 0) {\n throw new Error(`Target directory is not empty: ${target}`);\n }\n mkdirSync(target, { recursive: true });\n for (const file of tpl.files(opts)) {\n const out = join(target, file.path);\n mkdirSync(dirname(out), { recursive: true });\n writeFileSync(out, file.contents, \"utf8\");\n }\n return target;\n}\n","import type { ScaffoldOptions, TemplateFile } from \"../types.js\";\n\nexport const TS_TSCONFIG: TemplateFile = {\n path: \"tsconfig.json\",\n contents: JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"Bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n declaration: false,\n outDir: \"dist\",\n },\n include: [\"src/**/*\"],\n },\n null,\n 2,\n ) + \"\\n\",\n};\n\nexport function packageJson(opts: ScaffoldOptions, deps: Record<string, string> = {}): TemplateFile {\n const isTs = opts.language === \"typescript\";\n return {\n path: \"package.json\",\n contents: JSON.stringify(\n {\n name: opts.name,\n version: \"0.1.0\",\n private: true,\n type: \"module\",\n main: isTs ? \"dist/index.js\" : \"src/index.js\",\n scripts: {\n start: isTs ? \"node dist/index.js\" : \"node src/index.js\",\n ...(isTs ? { build: \"tsc\", dev: \"tsx watch src/index.ts\" } : {}),\n },\n dependencies: {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n zod: \"^3.22.4\",\n ...deps,\n },\n ...(isTs\n ? {\n devDependencies: {\n \"@types/node\": \"^20.11.0\",\n tsx: \"^4.7.0\",\n typescript: \"^5.4.0\",\n },\n }\n : {}),\n },\n null,\n 2,\n ) + \"\\n\",\n };\n}\n\nexport function gitignore(): TemplateFile {\n return {\n path: \".gitignore\",\n contents: [\"node_modules\", \"dist\", \".env\", \"*.log\", \".DS_Store\", \"\"].join(\"\\n\"),\n };\n}\n\nexport function envExample(vars: { name: string; description: string }[]): TemplateFile {\n const lines = [\n \"# Environment variables for this MCP server\",\n ...vars.map((v) => `${v.name}= # ${v.description}`),\n \"\",\n ];\n return { path: \".env.example\", contents: lines.join(\"\\n\") };\n}\n\nexport function authMiddleware(opts: ScaffoldOptions): string {\n if (!opts.auth) return \"\";\n return `\nfunction requireAuth(extra: { request?: { headers?: Record<string, string> } }): void {\n const expected = process.env.MCP_API_KEY;\n if (!expected) return;\n const provided = extra.request?.headers?.[\"x-api-key\"];\n if (provided !== expected) throw new Error(\"Unauthorized\");\n}\n`.trim();\n}\n\nexport function readme(opts: ScaffoldOptions, extra: string): TemplateFile {\n const bin = opts.language === \"typescript\" ? \"node dist/index.js\" : \"node src/index.js\";\n const cmd = opts.transport === \"stdio\" ? bin : `${bin} --port 8080`;\n return {\n path: \"README.md\",\n contents: `# ${opts.name}\n\nAn MCP server scaffolded by \\`create-mcp-server\\`.\n\n## Run\n\n\\`\\`\\`bash\ncp .env.example .env\n# fill in values\nnpm install\n${opts.language === \"typescript\" ? \"npm run build\\n\" : \"\"}npm start\n\\`\\`\\`\n\n## Claude Desktop config\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"${opts.name}\": {\n \"command\": \"${bin.split(\" \")[0]}\",\n \"args\": ${JSON.stringify(bin.split(\" \").slice(1))},\n \"env\": {}\n }\n }\n}\n\\`\\`\\`\n\n${extra}\n\n> Generated by \\`create-mcp-server\\`. Replace this README with your own.\n`,\n };\n}\n","import type { TemplateDescriptor, TemplateFile } from \"../types.js\";\nimport { envExample, gitignore, packageJson, readme, TS_TSCONFIG, authMiddleware } from \"./common.js\";\n\nconst blankIndexTs = (auth: boolean) => `\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\n${auth ? authMiddleware({ auth: true, name: \"\", template: \"blank\", transport: \"stdio\", language: \"typescript\" } as any) : \"\"}\n\nconst server = new Server(\n { name: \"blank-mcp-server\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n);\n\nconst TOOLS: Tool[] = [\n {\n name: \"echo\",\n description: \"Returns whatever message you send. The simplest possible tool.\",\n inputSchema: {\n type: \"object\",\n properties: { message: { type: \"string\" } },\n required: [\"message\"],\n },\n },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request${auth ? \", extra\" : \"\"}) => {\n ${auth ? \"requireAuth(extra as any);\" : \"\"}\n if (request.params.name === \"echo\") {\n const args = z.object({ message: z.string() }).parse(request.params.arguments);\n return { content: [{ type: \"text\", text: args.message }] };\n }\n return { content: [{ type: \"text\", text: \"Unknown tool: \" + request.params.name }], isError: true };\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\"blank-mcp-server: ready\");\n`.trim() + \"\\n\";\n\nexport const blankTemplate: TemplateDescriptor = {\n name: \"blank\",\n description: \"Minimal MCP server with one example tool and explanatory comments.\",\n envVars: [],\n files(opts) {\n const files: TemplateFile[] = [packageJson(opts), gitignore(), envExample([])];\n if (opts.language === \"typescript\") {\n files.push(TS_TSCONFIG);\n files.push({ path: \"src/index.ts\", contents: blankIndexTs(opts.auth) });\n } else {\n files.push({\n path: \"src/index.js\",\n contents: blankIndexTs(opts.auth).replace(/: \\w+(\\[\\])?/g, \"\").replace(/import type[\\s\\S]+?from[^;]+;\\n/g, \"\"),\n });\n }\n files.push(\n readme(opts, `\n## Tools\n\n- \\`echo\\` — echoes back the supplied \\`message\\`.\n\n## Adding more tools\n\n1. Append to the \\`TOOLS\\` array with a JSON Schema for inputs.\n2. Add a branch to the \\`CallToolRequestSchema\\` handler returning \\`{ content: [...] }\\`.\n`),\n );\n return files;\n },\n};\n","import type { TemplateDescriptor, TemplateFile } from \"../types.js\";\nimport { envExample, gitignore, packageJson, readme, TS_TSCONFIG, authMiddleware } from \"./common.js\";\n\nconst postgresIndex = (auth: boolean) => `\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport pg from \"pg\";\n\nconst { Pool } = pg;\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL });\n\n${auth ? authMiddleware({ auth: true, name: \"\", template: \"postgres\", transport: \"stdio\", language: \"typescript\" } as any) : \"\"}\n\nconst server = new Server(\n { name: \"postgres-mcp\", version: \"0.1.0\" },\n { capabilities: { tools: {} } },\n);\n\nconst TOOLS: Tool[] = [\n {\n name: \"query\",\n description: \"Run a read-only SQL query with bound parameters\",\n inputSchema: {\n type: \"object\",\n properties: { sql: { type: \"string\" }, params: { type: \"array\", items: {} } },\n required: [\"sql\"],\n },\n },\n {\n name: \"list_tables\",\n description: \"List all tables in the public schema\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"describe_table\",\n description: \"Describe columns and types of a given table\",\n inputSchema: {\n type: \"object\",\n properties: { table: { type: \"string\" } },\n required: [\"table\"],\n },\n },\n {\n name: \"insert\",\n description: \"Insert a row into the named table\",\n inputSchema: {\n type: \"object\",\n properties: { table: { type: \"string\" }, row: { type: \"object\" } },\n required: [\"table\", \"row\"],\n },\n },\n {\n name: \"update\",\n description: \"Update rows in the named table matching a where clause (parameterised)\",\n inputSchema: {\n type: \"object\",\n properties: {\n table: { type: \"string\" },\n set: { type: \"object\" },\n where: { type: \"object\" },\n },\n required: [\"table\", \"set\", \"where\"],\n },\n },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request${auth ? \", extra\" : \"\"}) => {\n ${auth ? \"requireAuth(extra as any);\" : \"\"}\n try {\n if (request.params.name === \"query\") {\n const args = z.object({ sql: z.string(), params: z.array(z.unknown()).optional() }).parse(request.params.arguments);\n const res = await pool.query(args.sql, args.params as unknown[] | undefined);\n return { content: [{ type: \"text\", text: JSON.stringify({ rowCount: res.rowCount, rows: res.rows }, null, 2) }] };\n }\n if (request.params.name === \"list_tables\") {\n const res = await pool.query(\"SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public'\");\n return { content: [{ type: \"text\", text: JSON.stringify(res.rows, null, 2) }] };\n }\n if (request.params.name === \"describe_table\") {\n const args = z.object({ table: z.string() }).parse(request.params.arguments);\n const res = await pool.query(\n \"SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema='public' AND table_name=$1 ORDER BY ordinal_position\",\n [args.table],\n );\n return { content: [{ type: \"text\", text: JSON.stringify(res.rows, null, 2) }] };\n }\n if (request.params.name === \"insert\") {\n const args = z.object({ table: z.string(), row: z.record(z.unknown()) }).parse(request.params.arguments);\n const cols = Object.keys(args.row);\n const placeholders = cols.map((_, i) => \"$\" + (i + 1)).join(\", \");\n const sql = \"INSERT INTO \" + JSON.stringify(args.table).slice(1, -1) + \" (\" + cols.map((c) => '\"' + c + '\"').join(\", \") + \") VALUES (\" + placeholders + \") RETURNING *\";\n const res = await pool.query(sql, cols.map((c) => args.row[c]));\n return { content: [{ type: \"text\", text: JSON.stringify(res.rows[0], null, 2) }] };\n }\n if (request.params.name === \"update\") {\n const args = z.object({ table: z.string(), set: z.record(z.unknown()), where: z.record(z.unknown()) }).parse(request.params.arguments);\n const setKeys = Object.keys(args.set);\n const whereKeys = Object.keys(args.where);\n const setSql = setKeys.map((k, i) => '\"' + k + '\" = $' + (i + 1)).join(\", \");\n const whereSql = whereKeys.map((k, i) => '\"' + k + '\" = $' + (i + 1 + setKeys.length)).join(\" AND \");\n const sql = \"UPDATE \" + JSON.stringify(args.table).slice(1, -1) + \" SET \" + setSql + \" WHERE \" + whereSql + \" RETURNING *\";\n const params = [...setKeys.map((k) => args.set[k]), ...whereKeys.map((k) => args.where[k])];\n const res = await pool.query(sql, params);\n return { content: [{ type: \"text\", text: JSON.stringify({ updated: res.rowCount, rows: res.rows }, null, 2) }] };\n }\n return { content: [{ type: \"text\", text: \"Unknown tool\" }], isError: true };\n } catch (err) {\n return { content: [{ type: \"text\", text: String(err) }], isError: true };\n }\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\"postgres-mcp: connected\");\n`.trim() + \"\\n\";\n\nexport const postgresTemplate: TemplateDescriptor = {\n name: \"postgres\",\n description: \"MCP server backed by Postgres with query, list_tables, describe_table, insert, update tools.\",\n envVars: [\n { name: \"DATABASE_URL\", description: \"Postgres connection string e.g. postgres://user:pass@host:5432/db\" },\n ],\n files(opts) {\n const files: TemplateFile[] = [\n packageJson(opts, { pg: \"^8.11.3\" }),\n gitignore(),\n envExample(this.envVars),\n ];\n if (opts.language === \"typescript\") {\n files.push(TS_TSCONFIG);\n files.push({ path: \"src/index.ts\", contents: postgresIndex(opts.auth) });\n } else {\n files.push({\n path: \"src/index.js\",\n contents: postgresIndex(opts.auth).replace(/: \\w+(\\[\\])?/g, \"\").replace(/import type[\\s\\S]+?from[^;]+;\\n/g, \"\"),\n });\n }\n files.push(\n readme(opts, `\n## Tools\n\n- \\`query\\` — run an arbitrary SQL query with bound parameters\n- \\`list_tables\\` — list public-schema tables\n- \\`describe_table\\` — describe columns of a table\n- \\`insert\\` — insert a row into a table\n- \\`update\\` — update rows matching a where clause\n`),\n );\n return files;\n },\n};\n","import type { TemplateDescriptor, TemplateFile } from \"../types.js\";\nimport { envExample, gitignore, packageJson, readme, TS_TSCONFIG, authMiddleware } from \"./common.js\";\n\nconst stripeIndex = (auth: boolean) => `\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport Stripe from \"stripe\";\nimport { z } from \"zod\";\n\nconst stripe = new Stripe(process.env.STRIPE_SECRET_KEY ?? \"\");\n\n${auth ? authMiddleware({ auth: true, name: \"\", template: \"stripe\", transport: \"stdio\", language: \"typescript\" } as any) : \"\"}\n\nconst server = new Server({ name: \"stripe-mcp\", version: \"0.1.0\" }, { capabilities: { tools: {} } });\n\nconst TOOLS: Tool[] = [\n { name: \"list_customers\", description: \"List Stripe customers\", inputSchema: { type: \"object\", properties: { limit: { type: \"number\" } } } },\n { name: \"get_customer\", description: \"Get a customer by id\", inputSchema: { type: \"object\", properties: { id: { type: \"string\" } }, required: [\"id\"] } },\n { name: \"list_invoices\", description: \"List recent invoices\", inputSchema: { type: \"object\", properties: { limit: { type: \"number\" } } } },\n {\n name: \"create_payment_link\",\n description: \"Create a Stripe payment link for a price\",\n inputSchema: { type: \"object\", properties: { price: { type: \"string\" }, quantity: { type: \"number\" } }, required: [\"price\"] },\n },\n { name: \"get_balance\", description: \"Get the current Stripe balance\", inputSchema: { type: \"object\", properties: {} } },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request${auth ? \", extra\" : \"\"}) => {\n ${auth ? \"requireAuth(extra as any);\" : \"\"}\n try {\n if (request.params.name === \"list_customers\") {\n const args = z.object({ limit: z.number().optional() }).parse(request.params.arguments ?? {});\n const res = await stripe.customers.list({ limit: args.limit ?? 10 });\n return { content: [{ type: \"text\", text: JSON.stringify(res.data, null, 2) }] };\n }\n if (request.params.name === \"get_customer\") {\n const args = z.object({ id: z.string() }).parse(request.params.arguments);\n const c = await stripe.customers.retrieve(args.id);\n return { content: [{ type: \"text\", text: JSON.stringify(c, null, 2) }] };\n }\n if (request.params.name === \"list_invoices\") {\n const args = z.object({ limit: z.number().optional() }).parse(request.params.arguments ?? {});\n const res = await stripe.invoices.list({ limit: args.limit ?? 10 });\n return { content: [{ type: \"text\", text: JSON.stringify(res.data, null, 2) }] };\n }\n if (request.params.name === \"create_payment_link\") {\n const args = z.object({ price: z.string(), quantity: z.number().default(1) }).parse(request.params.arguments);\n const link = await stripe.paymentLinks.create({ line_items: [{ price: args.price, quantity: args.quantity }] });\n return { content: [{ type: \"text\", text: JSON.stringify(link, null, 2) }] };\n }\n if (request.params.name === \"get_balance\") {\n const b = await stripe.balance.retrieve();\n return { content: [{ type: \"text\", text: JSON.stringify(b, null, 2) }] };\n }\n return { content: [{ type: \"text\", text: \"Unknown tool\" }], isError: true };\n } catch (err) {\n return { content: [{ type: \"text\", text: String(err) }], isError: true };\n }\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\"stripe-mcp: connected\");\n`.trim() + \"\\n\";\n\nexport const stripeTemplate: TemplateDescriptor = {\n name: \"stripe\",\n description: \"Stripe customer / invoice / payment link tools via the official Stripe SDK.\",\n envVars: [{ name: \"STRIPE_SECRET_KEY\", description: \"Stripe secret key (sk_test_... or sk_live_...)\" }],\n files(opts) {\n const files: TemplateFile[] = [\n packageJson(opts, { stripe: \"^14.20.0\" }),\n gitignore(),\n envExample(this.envVars),\n ];\n if (opts.language === \"typescript\") {\n files.push(TS_TSCONFIG);\n files.push({ path: \"src/index.ts\", contents: stripeIndex(opts.auth) });\n } else {\n files.push({\n path: \"src/index.js\",\n contents: stripeIndex(opts.auth).replace(/: \\w+(\\[\\])?/g, \"\").replace(/import type[\\s\\S]+?from[^;]+;\\n/g, \"\"),\n });\n }\n files.push(\n readme(opts, `\n## Tools\n\n- \\`list_customers\\`, \\`get_customer\\` — customer reads\n- \\`list_invoices\\` — invoice reads\n- \\`create_payment_link\\` — create a Stripe payment link\n- \\`get_balance\\` — current balance\n`),\n );\n return files;\n },\n};\n","import type { TemplateDescriptor, TemplateFile } from \"../types.js\";\nimport { envExample, gitignore, packageJson, readme, TS_TSCONFIG, authMiddleware } from \"./common.js\";\n\nconst fsIndex = (auth: boolean) => `\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { readFile, writeFile, readdir, stat } from \"node:fs/promises\";\nimport { join, resolve, sep } from \"node:path\";\n\nconst ROOT = resolve(process.env.SANDBOX_ROOT ?? process.cwd());\n\nfunction safePath(p: string): string {\n const abs = resolve(ROOT, p);\n if (!abs.startsWith(ROOT + sep) && abs !== ROOT) throw new Error(\"Path escapes sandbox\");\n return abs;\n}\n\n${auth ? authMiddleware({ auth: true, name: \"\", template: \"filesystem\", transport: \"stdio\", language: \"typescript\" } as any) : \"\"}\n\nconst server = new Server({ name: \"filesystem-mcp\", version: \"0.1.0\" }, { capabilities: { tools: {} } });\n\nconst TOOLS: Tool[] = [\n { name: \"read_file\", description: \"Read a UTF-8 file\", inputSchema: { type: \"object\", properties: { path: { type: \"string\" } }, required: [\"path\"] } },\n { name: \"write_file\", description: \"Write a UTF-8 file\", inputSchema: { type: \"object\", properties: { path: { type: \"string\" }, contents: { type: \"string\" } }, required: [\"path\", \"contents\"] } },\n { name: \"list_directory\", description: \"List a directory\", inputSchema: { type: \"object\", properties: { path: { type: \"string\" } }, required: [\"path\"] } },\n { name: \"search_files\", description: \"Recursively grep files for a substring\", inputSchema: { type: \"object\", properties: { needle: { type: \"string\" }, path: { type: \"string\" } }, required: [\"needle\"] } },\n { name: \"get_file_info\", description: \"stat a file or directory\", inputSchema: { type: \"object\", properties: { path: { type: \"string\" } }, required: [\"path\"] } },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request${auth ? \", extra\" : \"\"}) => {\n ${auth ? \"requireAuth(extra as any);\" : \"\"}\n try {\n if (request.params.name === \"read_file\") {\n const args = z.object({ path: z.string() }).parse(request.params.arguments);\n const content = await readFile(safePath(args.path), \"utf8\");\n return { content: [{ type: \"text\", text: content }] };\n }\n if (request.params.name === \"write_file\") {\n const args = z.object({ path: z.string(), contents: z.string() }).parse(request.params.arguments);\n await writeFile(safePath(args.path), args.contents, \"utf8\");\n return { content: [{ type: \"text\", text: \"OK\" }] };\n }\n if (request.params.name === \"list_directory\") {\n const args = z.object({ path: z.string() }).parse(request.params.arguments);\n const entries = await readdir(safePath(args.path), { withFileTypes: true });\n return { content: [{ type: \"text\", text: JSON.stringify(entries.map((e) => ({ name: e.name, dir: e.isDirectory() })), null, 2) }] };\n }\n if (request.params.name === \"search_files\") {\n const args = z.object({ needle: z.string(), path: z.string().default(\".\") }).parse(request.params.arguments);\n const hits = await search(safePath(args.path), args.needle);\n return { content: [{ type: \"text\", text: JSON.stringify(hits, null, 2) }] };\n }\n if (request.params.name === \"get_file_info\") {\n const args = z.object({ path: z.string() }).parse(request.params.arguments);\n const s = await stat(safePath(args.path));\n return { content: [{ type: \"text\", text: JSON.stringify({ size: s.size, isDir: s.isDirectory(), mtime: s.mtime }, null, 2) }] };\n }\n return { content: [{ type: \"text\", text: \"Unknown tool\" }], isError: true };\n } catch (err) {\n return { content: [{ type: \"text\", text: String(err) }], isError: true };\n }\n});\n\nasync function search(root: string, needle: string): Promise<{ file: string; line: number; text: string }[]> {\n const out: { file: string; line: number; text: string }[] = [];\n async function walk(d: string): Promise<void> {\n const entries = await readdir(d, { withFileTypes: true });\n for (const e of entries) {\n const p = join(d, e.name);\n if (e.isDirectory()) await walk(p);\n else if (e.isFile()) {\n try {\n const txt = await readFile(p, \"utf8\");\n const lines = txt.split(/\\\\r?\\\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? \"\";\n if (line.includes(needle)) out.push({ file: p, line: i + 1, text: line });\n }\n } catch {\n // skip binary or unreadable files\n }\n }\n }\n }\n await walk(root);\n return out;\n}\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\"filesystem-mcp: ready under \" + ROOT);\n`.trim() + \"\\n\";\n\nexport const filesystemTemplate: TemplateDescriptor = {\n name: \"filesystem\",\n description: \"Sandboxed filesystem tools (read, write, list, search, stat).\",\n envVars: [{ name: \"SANDBOX_ROOT\", description: \"Absolute path the server is allowed to read/write\" }],\n files(opts) {\n const files: TemplateFile[] = [packageJson(opts), gitignore(), envExample(this.envVars)];\n if (opts.language === \"typescript\") {\n files.push(TS_TSCONFIG);\n files.push({ path: \"src/index.ts\", contents: fsIndex(opts.auth) });\n } else {\n files.push({\n path: \"src/index.js\",\n contents: fsIndex(opts.auth).replace(/: \\w+(\\[\\])?/g, \"\").replace(/import type[\\s\\S]+?from[^;]+;\\n/g, \"\"),\n });\n }\n files.push(readme(opts, \"## Tools\\n\\n- read_file, write_file, list_directory, search_files, get_file_info\"));\n return files;\n },\n};\n","import type { TemplateDescriptor, TemplateFile } from \"../types.js\";\nimport { envExample, gitignore, packageJson, readme, TS_TSCONFIG, authMiddleware } from \"./common.js\";\n\nconst restIndex = (auth: boolean) => `\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\nimport { readFile } from \"node:fs/promises\";\n\n${auth ? authMiddleware({ auth: true, name: \"\", template: \"rest\", transport: \"stdio\", language: \"typescript\" } as any) : \"\"}\n\ninterface OpenApiSpec {\n servers?: Array<{ url: string }>;\n paths: Record<string, Record<string, { operationId?: string; summary?: string; parameters?: Array<{ name: string; in: string; required?: boolean; schema?: { type?: string } }>; requestBody?: { content?: { \"application/json\"?: { schema?: { type: string; properties?: Record<string, unknown> } } } } }>>;\n}\n\nconst specPath = process.env.OPENAPI_SPEC_PATH ?? \"openapi.json\";\nconst spec = JSON.parse(await readFile(specPath, \"utf8\")) as OpenApiSpec;\nconst baseUrl = spec.servers?.[0]?.url ?? process.env.API_BASE_URL ?? \"\";\n\ninterface ToolEntry { method: string; path: string; spec: NonNullable<OpenApiSpec[\"paths\"]>[string][string]; }\nconst toolMap = new Map<string, ToolEntry>();\n\nconst TOOLS: Tool[] = [];\nfor (const [route, methods] of Object.entries(spec.paths)) {\n for (const [method, op] of Object.entries(methods)) {\n if (![\"get\", \"post\"].includes(method)) continue;\n const name = op.operationId ?? (method + \"_\" + route).replace(/[^a-zA-Z0-9_]/g, \"_\");\n const props: Record<string, unknown> = {};\n const required: string[] = [];\n for (const p of op.parameters ?? []) {\n props[p.name] = { type: p.schema?.type ?? \"string\" };\n if (p.required) required.push(p.name);\n }\n const bodySchema = op.requestBody?.content?.[\"application/json\"]?.schema;\n if (bodySchema?.properties) {\n for (const [k, v] of Object.entries(bodySchema.properties)) {\n props[k] = v;\n }\n }\n TOOLS.push({\n name,\n description: op.summary ?? (method.toUpperCase() + \" \" + route),\n inputSchema: { type: \"object\", properties: props, required },\n });\n toolMap.set(name, { method, path: route, spec: op });\n }\n}\n\nconst server = new Server({ name: \"rest-mcp\", version: \"0.1.0\" }, { capabilities: { tools: {} } });\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));\nserver.setRequestHandler(CallToolRequestSchema, async (request${auth ? \", extra\" : \"\"}) => {\n ${auth ? \"requireAuth(extra as any);\" : \"\"}\n const entry = toolMap.get(request.params.name);\n if (!entry) return { content: [{ type: \"text\", text: \"Unknown tool\" }], isError: true };\n const args = z.record(z.unknown()).parse(request.params.arguments ?? {});\n\n let url = baseUrl + entry.path;\n for (const p of entry.spec.parameters ?? []) {\n if (p.in === \"path\") url = url.replace(\"{\" + p.name + \"}\", encodeURIComponent(String(args[p.name] ?? \"\")));\n }\n const query: string[] = [];\n for (const p of entry.spec.parameters ?? []) {\n if (p.in === \"query\" && args[p.name] !== undefined) {\n query.push(encodeURIComponent(p.name) + \"=\" + encodeURIComponent(String(args[p.name])));\n }\n }\n if (query.length) url += \"?\" + query.join(\"&\");\n\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (process.env.API_BEARER_TOKEN) headers.authorization = \"Bearer \" + process.env.API_BEARER_TOKEN;\n if (process.env.API_KEY_HEADER && process.env.API_KEY) headers[process.env.API_KEY_HEADER] = process.env.API_KEY;\n\n const init: RequestInit = { method: entry.method.toUpperCase(), headers };\n if (entry.method !== \"get\") {\n const bodyKeys = Object.keys(entry.spec.requestBody?.content?.[\"application/json\"]?.schema?.properties ?? {});\n const body: Record<string, unknown> = {};\n for (const k of bodyKeys) if (args[k] !== undefined) body[k] = args[k];\n init.body = JSON.stringify(body);\n }\n const res = await fetch(url, init);\n const text = await res.text();\n return { content: [{ type: \"text\", text }], isError: !res.ok };\n});\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\nconsole.error(\"rest-mcp: ready (\" + TOOLS.length + \" tools)\");\n`.trim() + \"\\n\";\n\nexport const restTemplate: TemplateDescriptor = {\n name: \"rest\",\n description: \"Wraps any OpenAPI 3.0 REST API as MCP tools.\",\n envVars: [\n { name: \"OPENAPI_SPEC_PATH\", description: \"Path to an OpenAPI 3.0 JSON file\" },\n { name: \"API_BASE_URL\", description: \"Override servers[0].url from the spec\" },\n { name: \"API_BEARER_TOKEN\", description: \"Optional Bearer token\" },\n { name: \"API_KEY_HEADER\", description: \"Optional API-key header name\" },\n { name: \"API_KEY\", description: \"Optional API-key value\" },\n ],\n files(opts) {\n const files: TemplateFile[] = [packageJson(opts), gitignore(), envExample(this.envVars)];\n if (opts.language === \"typescript\") {\n files.push(TS_TSCONFIG);\n files.push({ path: \"src/index.ts\", contents: restIndex(opts.auth) });\n } else {\n files.push({\n path: \"src/index.js\",\n contents: restIndex(opts.auth).replace(/: \\w+(\\[\\])?/g, \"\").replace(/import type[\\s\\S]+?from[^;]+;\\n/g, \"\"),\n });\n }\n files.push({\n path: \"openapi.json\",\n contents: JSON.stringify({\n openapi: \"3.0.0\",\n info: { title: \"Example\", version: \"1.0.0\" },\n servers: [{ url: \"https://api.example.com\" }],\n paths: {\n \"/ping\": { get: { operationId: \"ping\", summary: \"Health check\" } },\n },\n }, null, 2) + \"\\n\",\n });\n files.push(readme(opts, \"## Tools\\n\\nAuto-generated from `openapi.json`. Replace the spec to expose your own API.\"));\n return files;\n },\n};\n"],"mappings":"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","names":[]}
|