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.

172 lines 6.18 kB
"use strict"; /** * Application-wide constants for NPM Plus MCP Server. * Centralizes all configuration values, URLs, version information, and detection patterns. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.CORS_HEADERS = exports.RATE_LIMITING = exports.SEARCH_QUALITY_WEIGHTS = exports.HTTP_SETTINGS = exports.CACHE_SETTINGS = exports.DEFAULT_TIMEOUTS = exports.NPM_ECOSYSTEM = exports.EDITOR_PATTERNS = exports.URLS = exports.LOCK_FILES = exports.PACKAGE_MANAGERS = exports.SERVER_NAME = exports.MCP_PROTOCOL_VERSION = exports.VERSION = void 0; exports.detectEditorFromUserAgent = detectEditorFromUserAgent; // ==================== VERSION AND PROTOCOL ==================== /** * Current application version used across all components. * @constant {string} */ exports.VERSION = '12.0.19'; /** * MCP (Model Context Protocol) version supported by this server. * @constant {string} */ exports.MCP_PROTOCOL_VERSION = '2024-11-05'; /** * Server name identifier for MCP protocol. * @constant {string} */ exports.SERVER_NAME = 'npmplus-mcp'; // ==================== PACKAGE MANAGERS ==================== /** * Supported package managers with their command-line names. * @constant {Record<string, PackageManagerType>} */ exports.PACKAGE_MANAGERS = Object.freeze({ NPM: 'npm', YARN: 'yarn', PNPM: 'pnpm', }); /** * Package manager lock file names for automatic detection. * Ordered by detection priority (most specific first). * @constant {Array<{manager: string, file: string}>} */ exports.LOCK_FILES = [ { manager: exports.PACKAGE_MANAGERS.PNPM, file: 'pnpm-lock.yaml' }, { manager: exports.PACKAGE_MANAGERS.YARN, file: 'yarn.lock' }, { manager: exports.PACKAGE_MANAGERS.NPM, file: 'package-lock.json' }, ]; // ==================== EXTERNAL API URLS ==================== /** * External service URLs for package registry and analysis. * @constant {Record<string, string>} */ exports.URLS = Object.freeze({ // NPM Registry and API NPM_REGISTRY: 'https://registry.npmjs.org', NPM_API: 'https://api.npmjs.org', NPM_WEBSITE: 'https://www.npmjs.com', // Bundle analysis BUNDLEPHOBIA_API: 'https://bundlephobia.com/api', // Security databases GITHUB_ADVISORY_API: 'https://api.github.com/advisories', GITHUB_ADVISORIES_WEBSITE: 'https://github.com/advisories', OSV_API: 'https://api.osv.dev/v1', OSV_WEBSITE: 'https://osv.dev/vulnerability', }); // ==================== USER AGENT DETECTION ==================== /** * Editor detection patterns from User-Agent strings. * Each pattern maps to a standardized editor name. * @constant {Array<{pattern: string, name: string}>} */ exports.EDITOR_PATTERNS = Object.freeze([ { pattern: 'claude', name: 'claude' }, { pattern: 'windsurf', name: 'windsurf' }, { pattern: 'cursor', name: 'cursor' }, { pattern: 'vscode', name: 'vscode' }, { pattern: 'cline', name: 'cline' }, { pattern: 'vs code', name: 'vscode' }, { pattern: 'visual studio code', name: 'vscode' }, ]); // ==================== SECURITY CONSTANTS ==================== /** * Ecosystem identifier for npm packages in vulnerability databases. * @constant {string} */ exports.NPM_ECOSYSTEM = 'npm'; // ==================== TIMEOUT CONFIGURATIONS ==================== /** * Timeout configurations for various operations in milliseconds. * @constant {Record<string, number>} */ exports.DEFAULT_TIMEOUTS = { PACKAGE_MANAGER: 60000, // 60 seconds for package manager operations HTTP_REQUEST: 30000, // 30 seconds for HTTP requests RATE_LIMIT_RETRY: 1000, // 1 second retry delay for rate limiting }; // ==================== CACHE CONFIGURATIONS ==================== /** * Cache settings for various caching scenarios. * @constant {Record<string, number>} */ exports.CACHE_SETTINGS = { DEFAULT_TTL: 600, // 10 minutes default TTL SHORT_TTL: 300, // 5 minutes for volatile data LONG_TTL: 3600, // 1 hour for stable data CHECK_PERIOD: 120, // 2 minutes check period MAX_KEYS: 1000, // Maximum number of cache keys }; // ==================== HTTP CONFIGURATIONS ==================== /** * HTTP server and client configurations. * @constant {Record<string, number | string>} */ exports.HTTP_SETTINGS = { DEFAULT_PORT: 3000, RATE_LIMIT_CONCURRENT: 5, USER_AGENT: `mcp-package-manager/${exports.VERSION}`, }; // ==================== SEARCH QUALITY WEIGHTS ==================== /** * Quality weights for package search scoring. * @constant {Record<string, number>} */ exports.SEARCH_QUALITY_WEIGHTS = { QUALITY: 0.9, // Quality score weight POPULARITY: 0.8, // Popularity weight MAINTENANCE: 0.7, // Maintenance score weight }; // ==================== RATE LIMITING ==================== /** * Rate limiting configurations. * @constant {Record<string, number>} */ exports.RATE_LIMITING = { REQUESTS_PER_HOUR: 1000, WINDOW_MS: 60 * 60 * 1000, // 1 hour in milliseconds }; // ==================== CORS HEADERS ==================== /** * Standard CORS headers for API responses. * @constant {Record<string, string>} */ exports.CORS_HEADERS = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type, Authorization', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', }; // ==================== HELPER FUNCTIONS ==================== /** * Detects editor type from User-Agent string using predefined patterns. * * @param userAgent - The User-Agent string to analyze * @returns The detected editor name or 'unknown' if no match found * * @example * ```typescript * const editor = detectEditorFromUserAgent('Claude Desktop/1.0'); * console.log(editor); // 'claude' * * const unknown = detectEditorFromUserAgent('Custom Browser/1.0'); * console.log(unknown); // 'unknown' * ``` */ function detectEditorFromUserAgent(userAgent) { if (!userAgent) return 'unknown'; const ua = userAgent.toLowerCase(); for (const { pattern, name } of exports.EDITOR_PATTERNS) { if (ua.includes(pattern)) { return name; } } return 'unknown'; } //# sourceMappingURL=constants.js.map