UNPKG

npmplus-mcp-server

Version:

Production-ready MCP server for intelligent JavaScript package management. Works with Claude, Windsurf, Cursor, VS Code, and any MCP-compatible AI editor.

173 lines (170 loc) 7.24 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.createHTTPMCPServer = createHTTPMCPServer; const http_1 = require("http"); const sse_js_1 = require("@modelcontextprotocol/sdk/server/sse.js"); const server_js_1 = require("./server.js"); const constants_js_1 = require("./constants.js"); async function createHTTPMCPServer(port = constants_js_1.HTTP_SETTINGS.DEFAULT_PORT) { const mcpServer = await (0, server_js_1.createServer)(); const httpServer = (0, http_1.createServer)(async (req, res) => { // Enable CORS Object.entries(constants_js_1.CORS_HEADERS).forEach(([key, value]) => { res.setHeader(key, value); }); if (req.method === 'OPTIONS') { res.writeHead(200); res.end(); return; } if (req.url === '/health') { res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ status: 'healthy', server: constants_js_1.SERVER_NAME, version: constants_js_1.VERSION, timestamp: new Date().toISOString() })); return; } if (req.url === '/tools') { // Return tools list for analysis tools like Smithery try { // Import the tools modules to get the tools list const searchTools = await Promise.resolve().then(() => __importStar(require('./tools/search-tools.js'))); const installTools = await Promise.resolve().then(() => __importStar(require('./tools/install-tools.js'))); const securityTools = await Promise.resolve().then(() => __importStar(require('./tools/security-tools.js'))); const analysisTools = await Promise.resolve().then(() => __importStar(require('./tools/analysis-tools.js'))); const managementTools = await Promise.resolve().then(() => __importStar(require('./tools/management-tools.js'))); const { convertToolSchema } = await Promise.resolve().then(() => __importStar(require('./utils/schema-converter.js'))); const allTools = [ ...searchTools.tools, ...installTools.tools, ...securityTools.tools, ...analysisTools.tools, ...managementTools.tools ]; const convertedTools = allTools.map(tool => convertToolSchema(tool)); res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ tools: convertedTools }, null, 2)); return; } catch (error) { res.writeHead(500, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ error: 'Failed to load tools' })); return; } } if (req.url === '/mcp') { // Handle MCP over SSE const transport = new sse_js_1.SSEServerTransport("/mcp", res); await mcpServer.connect(transport); return; } if (req.url === '/') { res.writeHead(200, { 'Content-Type': 'text/html' }); res.end(` <!DOCTYPE html> <html> <head> <title>JavaScript Package Manager MCP Server</title> <style> body { font-family: Arial, sans-serif; margin: 40px; } .container { max-width: 800px; margin: 0 auto; } .status { color: green; font-weight: bold; } code { background: #f4f4f4; padding: 2px 4px; border-radius: 3px; } pre { background: #f4f4f4; padding: 15px; border-radius: 5px; overflow-x: auto; } </style> </head> <body> <div class="container"> <h1>JavaScript Package Manager MCP Server</h1> <p class="status">✅ Server is running</p> <h2>Endpoints</h2> <ul> <li><code>/health</code> - Health check</li> <li><code>/tools</code> - Tools list (JSON)</li> <li><code>/mcp</code> - MCP Server-Sent Events endpoint</li> </ul> <h2>Configuration</h2> <p>Use this server in your MCP client:</p> <pre>{ "mcpServers": { "javascript-package-manager": { "command": "node", "args": ["-e", "require('http').get('${req.headers.host}/mcp')"], "env": {} } } }</pre> <h2>Available Tools</h2> <ul> <li>search_packages - Search npm registry</li> <li>install_packages - Install packages</li> <li>audit_dependencies - Security scanning</li> <li>check_bundle_size - Bundle analysis</li> <li>dependency_tree - Dependency visualization</li> <li>And many more...</li> </ul> </div> </body> </html> `); return; } res.writeHead(404, { 'Content-Type': 'text/plain' }); res.end('Not Found'); }); httpServer.listen(port, () => { console.log(`🚀 JavaScript Package Manager MCP Server running on port ${port}`); console.log(`📊 Health check: http://localhost:${port}/health`); console.log(`🔌 MCP endpoint: http://localhost:${port}/mcp`); }); // Graceful shutdown process.on('SIGTERM', () => { console.log('Received SIGTERM, shutting down gracefully'); httpServer.close(() => { process.exit(0); }); }); process.on('SIGINT', () => { console.log('Received SIGINT, shutting down gracefully'); httpServer.close(() => { process.exit(0); }); }); } //# sourceMappingURL=http-server.js.map