UNPKG

mcp-handler

Version:

Framework-agnostic HTTP adapter for Model Context Protocol servers

1 lines • 5.75 kB
{"version":3,"sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;AAEA,SAAS,eAAe;AACxB,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,WAAW;AALlB;AAAA;AAOA,QAAM,UAAU,IAAI,QAAQ;AAE5B,QAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BvB,mBAAe,uBAEb;AACA,YAAM,MAAM,QAAQ,IAAI;AACxB,UAAI;AAEF,cAAM,QAAQ,MAAM,GAAG,QAAQ,GAAG;AAElC,YAAI,MAAM,SAAS,WAAW;AAAG,iBAAO;AACxC,YAAI,MAAM,SAAS,gBAAgB;AAAG,iBAAO;AAC7C,YAAI,MAAM,SAAS,WAAW;AAAG,iBAAO;AACxC,YAAI,MAAM,SAAS,mBAAmB;AAAG,iBAAO;AAGhD,eAAO;AAAA,MACT,SAAS,OAAO;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAEA,mBAAe,oBACb,gBACA;AACA,YAAM,YAAY,MAAM,OAAO,eAAoB,GAAG;AACtD,YAAM,eAAe,CAAC,eAAe,gCAAgC,KAAK;AAE1E,YAAM,WAAW;AAAA,QACf,KAAK,eAAe,aAAa,KAAK,GAAG,CAAC;AAAA,QAC1C,MAAM,YAAY,aAAa,KAAK,GAAG,CAAC;AAAA,QACxC,MAAM,YAAY,aAAa,KAAK,GAAG,CAAC;AAAA,QACxC,KAAK,WAAW,aAAa,KAAK,GAAG,CAAC;AAAA,MACxC;AAEA,UAAI;AACF,gBAAQ;AAAA,UACN,MAAM,KAAK;AAAA,gCAAmC,cAAc,KAAK;AAAA,QACnE;AACA,iBAAS,SAAS,cAAc,GAAG,EAAE,OAAO,UAAU,CAAC;AACvD,gBAAQ,IAAI,MAAM,MAAM,+CAA0C,CAAC;AAAA,MACrE,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AACA,gBAAQ,IAAI,MAAM,OAAO;AAAA,EAAK,SAAS,cAAc,CAAC,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AAEA,mBAAe,OAAO;AACpB,UAAI;AAEF,cAAM,cAAc,KAAK;AAAA,UACvB,MAAM,GAAG,SAAS,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,GAAG,OAAO;AAAA,QACrE;AAEA,YAAI,CAAC,YAAY,cAAc,QAAQ,CAAC,YAAY,iBAAiB,MAAM;AACzE,kBAAQ;AAAA,YACN,MAAM,IAAI,sDAAiD;AAAA,UAC7D;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAGA,cAAM,YAAY,KAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,OAAO,KAAK;AAC9D,cAAM,GAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG7C,cAAM,gBAAgB,KAAK,KAAK,WAAW,UAAU;AACrD,cAAM,GAAG,UAAU,eAAe,cAAc;AAEhD,gBAAQ,IAAI,MAAM,MAAM,gDAA2C,CAAC;AAGpE,cAAM,iBAAiB,MAAM,qBAAqB;AAClD,cAAM,oBAAoB,cAAc;AAAA,MAC1C,SAAS,OAAO;AACd,gBAAQ,MAAM,MAAM,IAAI,mCAAmC,GAAG,KAAK;AACnE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,YACG,KAAK,aAAa,EAClB,YAAY,sDAAsD,EAClE,OAAO,IAAI;AAEd,YAAQ,MAAM;AAAA;AAAA","sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\n\nconst program = new Command();\n\nconst ROUTE_TEMPLATE = `import { createMcpHandler } from 'mcp-handler';\nimport { z } from 'zod';\n\nconst handler = createMcpHandler(\n server => {\n server.registerTool(\n 'roll_dice',\n {\n description: 'Rolls an N-sided die',\n inputSchema: z.object({\n sides: z.number().int().min(2),\n }),\n },\n async ({ sides }) => {\n const value = 1 + Math.floor(Math.random() * sides);\n return {\n content: [{ type: 'text', text: \\`šŸŽ² You rolled a \\${value}!\\` }],\n };\n }\n );\n },\n {\n // Optional: server options plus handler extras\n verboseLogs: true,\n }\n);\n\nexport { handler as GET, handler as POST };\n`;\n\nasync function detectPackageManager(): Promise<\n \"npm\" | \"pnpm\" | \"yarn\" | \"bun\"\n> {\n const cwd = process.cwd();\n try {\n // Check for lock files in order of preference\n const files = await fs.readdir(cwd);\n\n if (files.includes(\"bun.lockb\")) return \"bun\";\n if (files.includes(\"pnpm-lock.yaml\")) return \"pnpm\";\n if (files.includes(\"yarn.lock\")) return \"yarn\";\n if (files.includes(\"package-lock.json\")) return \"npm\";\n\n // Fallback to npm if no lock file found\n return \"npm\";\n } catch (error) {\n return \"npm\";\n }\n}\n\nasync function installDependencies(\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\",\n) {\n const execSync = (await import(\"node:child_process\")).execSync;\n const dependencies = [\"mcp-handler\", \"@modelcontextprotocol/server\", \"zod\"];\n\n const commands = {\n npm: `npm install ${dependencies.join(\" \")}`,\n pnpm: `pnpm add ${dependencies.join(\" \")}`,\n yarn: `yarn add ${dependencies.join(\" \")}`,\n bun: `bun add ${dependencies.join(\" \")}`,\n };\n\n try {\n console.log(\n chalk.blue(`\\nInstalling dependencies using ${packageManager}...`),\n );\n execSync(commands[packageManager], { stdio: \"inherit\" });\n console.log(chalk.green(\"\\nāœ… Dependencies installed successfully!\"));\n } catch (error) {\n console.error(\n chalk.red(\n \"\\nāŒ Failed to install dependencies. You can install them manually:\",\n ),\n );\n console.log(chalk.yellow(`\\n${commands[packageManager]}`));\n }\n}\n\nasync function init() {\n try {\n // Check if we're in a Next.js project\n const packageJson = JSON.parse(\n await fs.readFile(path.join(process.cwd(), \"package.json\"), \"utf-8\"),\n );\n\n if (!packageJson.dependencies?.next && !packageJson.devDependencies?.next) {\n console.error(\n chalk.red(\"āŒ This command must be run in a Next.js project\"),\n );\n process.exit(1);\n }\n\n // Create the static app/api/mcp route\n const routePath = path.join(process.cwd(), \"app\", \"api\", \"mcp\");\n await fs.mkdir(routePath, { recursive: true });\n\n // Create the route.ts file\n const routeFilePath = path.join(routePath, \"route.ts\");\n await fs.writeFile(routeFilePath, ROUTE_TEMPLATE);\n\n console.log(chalk.green(\"āœ… Successfully created MCP route handler!\"));\n\n // Detect and use the appropriate package manager\n const packageManager = await detectPackageManager();\n await installDependencies(packageManager);\n } catch (error) {\n console.error(chalk.red(\"Error creating MCP route handler:\"), error);\n process.exit(1);\n }\n}\n\nprogram\n .name(\"mcp-handler\")\n .description(\"Initialize MCP route handler in your Next.js project\")\n .action(init);\n\nprogram.parse();\n"]}