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
JavaScript
;
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