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.
61 lines • 2.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.handlers = exports.tools = void 0;
const cache_js_1 = require("../cache.js");
const http_client_js_1 = require("../http-client.js");
const index_js_1 = require("../validators/index.js");
const index_js_2 = require("../utils/index.js");
// Export tools and handlers
exports.tools = [
{
name: "search_packages",
description: "Search for packages in the npm registry",
inputSchema: index_js_1.SearchPackagesSchema
}
];
exports.handlers = new Map([
["search_packages", handleSearchPackages]
]);
async function handleSearchPackages(args) {
const input = index_js_1.SearchPackagesSchema.parse(args);
// Check cache first
const cacheKey = cache_js_1.CacheManager.keys.searchResults(input.query, input.limit);
const cached = await cache_js_1.cache.get(cacheKey);
if (cached) {
return (0, index_js_2.createSuccessResponse)(formatSearchResults(cached, input.query));
}
try {
const searchResults = await http_client_js_1.httpClient.npmSearch(input.query, {
size: input.limit,
from: input.from
});
// Cache for 5 minutes
await cache_js_1.cache.set(cacheKey, searchResults, 300);
return (0, index_js_2.createSuccessResponse)(formatSearchResults(searchResults, input.query));
}
catch (error) {
return (0, index_js_2.createErrorResponse)(error, 'Failed to search packages');
}
}
function formatSearchResults(results, query) {
const output = [
`🔍 Search results for "${query}":\n`
];
if (!results.objects || results.objects.length === 0) {
output.push("No packages found matching your query.");
return output.join("\n");
}
results.objects.slice(0, 10).forEach((item, index) => {
const pkg = item.package;
output.push(`${index + 1}. 📦 **${pkg.name}**`);
output.push(` Version: ${pkg.version}`);
output.push(` Description: ${(0, index_js_2.truncateText)(pkg.description || 'No description', 100)}`);
output.push(` Downloads: ${pkg.links?.npm ? '📊 Available' : 'N/A'}`);
output.push("");
});
if (results.total > results.objects.length) {
output.push(`Showing ${results.objects.length} of ${results.total} results`);
}
return output.join("\n");
}
//# sourceMappingURL=search-tools.js.map