jaegis-npm-mcp-server
Version:
NPM Package Management MCP Server with 10 production-ready tools including complete 5-step security pipeline
1 lines ⢠68.2 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/security_scan.ts"],"sourcesContent":["// Redirect any console.log to stderr to maintain JSON-RPC-only stdout\nconst __origConsoleLog = console.log;\nconsole.log = (...args: any[]) => { try { console.error(...args); } catch { } };\n\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport * as dotenv from 'dotenv';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as semver from 'semver';\nimport { execSync, spawn } from 'child_process';\nimport { scanDirectory } from './security_scan.js';\n// Using built-in fetch (Node.js 18+) for better compatibility\n\n// Load environment variables with cascade (HOME\\.mcp\\.env -> project .env)\n(function loadEnvCascade() {\n const homeEnv = path.join(os.homedir() || '', '.mcp', '.env');\n const localEnv = path.resolve(process.cwd(), '.env');\n for (const p of [homeEnv, localEnv]) {\n try { if (fs.existsSync(p)) { dotenv.config({ path: p, override: true }); } } catch { }\n }\n})();\n\n// Command line argument parsing (disabled for MCP stdio purity)\nconst args: string[] = [];\nconst hasListTools = false;\nconst hasToolsJson = false;\nconst hasHelp = false;\nconst formatTable = false;\n\n// Security: Credential sanitization\nfunction sanitizeCredential(value: string): string {\n if (!value || value.length < 8) return '****';\n return `${value.substring(0, 4)}****...****${value.substring(value.length - 4)}`;\n}\n\nfunction sanitizeEnvVars(env: Record<string, any>): Record<string, any> {\n const sensitiveKeys = ['TOKEN', 'KEY', 'SECRET', 'PASSWORD', 'API_'];\n const sanitized = { ...env };\n\n Object.keys(sanitized).forEach(key => {\n if (sensitiveKeys.some(sensitive => key.toUpperCase().includes(sensitive))) {\n sanitized[key] = sanitizeCredential(sanitized[key]);\n }\n });\n\n return sanitized;\n}\n\n// Tool discovery and help system\ninterface ToolInfo {\n name: string;\n category: string;\n description: string;\n requiredParams: string[];\n optionalParams: string[];\n inputSchema: any;\n}\n\nfunction showHelp(): void {\n console.error(`\nNPM JAEGIS MCP Server v1.0.0 - NPM package management with 8 specialized tools\n\nUSAGE:\n npm-mcp-server [OPTIONS]\n\nOPTIONS:\n --list-tools List all available tools with descriptions\n --tools-json Output complete MCP tools schema as JSON\n --format=table Use table format for tool listings (default: JSON)\n --help, -h Show this help message\n\nENVIRONMENT VARIABLES:\n NPM_TOKEN NPM access token (required)\n Format: npm_*\n Generate at: https://www.npmjs.com/settings/tokens\n\n NPM_USERNAME NPM username (required)\n NPM_EMAIL NPM email (required)\n NPM_REGISTRY NPM registry URL (optional, default: https://registry.npmjs.org/)\n DEFAULT_PACKAGE Default package name (optional, default: JAEGIS-web-os)\n\nEXAMPLES:\n # List all tools in table format\n npm-mcp-server --list-tools --format=table\n\n # Get tools schema for MCP client integration\n npm-mcp-server --tools-json\n\n # Start the MCP server (default)\n npm-mcp-server\n\nQUICK SETUP:\n 1. Generate NPM token: https://www.npmjs.com/settings/tokens\n 2. Set environment variables:\n export NPM_TOKEN=npm_your_token_here\n export NPM_USERNAME=your_username\n export NPM_EMAIL=your_email@example.com\n 3. Run: npm-mcp-server\n\nFor detailed documentation, see: README.md\n`);\n}\n\nfunction getToolsInfo(): ToolInfo[] {\n return [\n {\n name: 'npm_package_info',\n category: 'Package Information',\n description: 'Get detailed information about an NPM package including metadata and dependencies',\n requiredParams: ['package_name'],\n optionalParams: ['version'],\n inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n },\n {\n name: 'npm_search_packages',\n category: 'Package Discovery',\n description: 'Search for NPM packages using keywords and filters',\n requiredParams: ['query'],\n optionalParams: ['limit'],\n inputSchema: { type: 'object', properties: { query: { type: 'string' } } }\n },\n {\n name: 'npm_publish_package',\n category: 'Package Publishing',\n description: 'Publish a package to NPM registry with authentication and specified configuration',\n requiredParams: ['package_path'],\n optionalParams: ['tag', 'access', 'additional_flags'],\n inputSchema: { type: 'object', properties: { package_path: { type: 'string' } } }\n },\n {\n name: 'npm_unpublish_package',\n category: 'Package Management',\n description: 'Unpublish a package version from NPM registry (irreversible)',\n requiredParams: ['package_name'],\n optionalParams: ['version'],\n inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n },\n {\n name: 'npm_deprecate_package',\n category: 'Package Management',\n description: 'Deprecate a package version with a custom message',\n requiredParams: ['package_name', 'version', 'message'],\n optionalParams: [],\n inputSchema: { type: 'object', properties: { package_name: { type: 'string' }, version: { type: 'string' }, message: { type: 'string' } } }\n },\n {\n name: 'npm_list_versions',\n category: 'Package Information',\n description: 'List all available versions of a package with release information',\n requiredParams: ['package_name'],\n optionalParams: [],\n inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n },\n {\n name: 'npm_download_stats',\n category: 'Package Analytics',\n description: 'Get download statistics and analytics for a package',\n requiredParams: ['package_name'],\n optionalParams: ['period'],\n inputSchema: { type: 'object', properties: { package_name: { type: 'string' } } }\n },\n {\n name: 'npm_validate_package',\n category: 'Package Validation',\n description: 'Validate package.json and check for publishing readiness',\n requiredParams: ['package_path'],\n optionalParams: [],\n inputSchema: { type: 'object', properties: { package_path: { type: 'string' } } }\n },\n {\n name: 'security_check',\n category: 'Security',\n description: 'Scan a directory for sensitive files and secrets',\n requiredParams: ['path'],\n optionalParams: [],\n inputSchema: { type: 'object', properties: { path: { type: 'string' } } }\n },\n {\n name: 'health_check',\n category: 'Diagnostics',\n description: 'Return server health, version, uptime, and dependency status',\n requiredParams: [],\n optionalParams: [],\n inputSchema: { type: 'object', properties: {} }\n }\n ];\n}\n\nfunction displayToolsTable(tools: ToolInfo[]): void {\n console.error('\\nš¦ NPM JAEGIS MCP Server - Tool Inventory\\n');\n console.error('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāā¬āāāāāāāāāāā');\n console.error('ā Tool Name ā Category ā Required ā Optional ā');\n console.error('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāā¼āāāāāāāāāāā¤');\n\n tools.forEach(tool => {\n const name = tool.name.padEnd(35);\n const category = tool.category.padEnd(32);\n const required = tool.requiredParams.length.toString().padEnd(8);\n const optional = tool.optionalParams.length.toString().padEnd(8);\n console.error(`ā ${name} ā ${category} ā ${required} ā ${optional} ā`);\n });\n\n console.error('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāā“āāāāāāāāāāā');\n\n // Summary by category\n const categories = tools.reduce((acc, tool) => {\n acc[tool.category] = (acc[tool.category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n console.error('\\nš Tool Summary by Category:');\n Object.entries(categories).forEach(([category, count]) => {\n console.error(` ⢠${category}: ${count} tools`);\n });\n console.error(`\\nšÆ Total: ${tools.length} tools available\\n`);\n}\n\nfunction displayToolsJson(tools: ToolInfo[], includeSchema: boolean = false): void {\n const output = {\n server: 'npm-jaegis-mcp-server',\n version: '1.0.0',\n totalTools: tools.length,\n categories: tools.reduce((acc, tool) => {\n acc[tool.category] = (acc[tool.category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>),\n tools: tools.map(tool => ({\n name: tool.name,\n category: tool.category,\n description: tool.description,\n parameters: {\n required: tool.requiredParams,\n optional: tool.optionalParams,\n total: tool.requiredParams.length + tool.optionalParams.length\n },\n ...(includeSchema && { inputSchema: tool.inputSchema })\n }))\n };\n\n console.error(JSON.stringify(output, null, 2));\n}\n\n// Handle command line arguments before server initialization\nif (hasHelp) {\n showHelp();\n process.exit(0);\n}\n\nif (hasListTools || hasToolsJson) {\n const tools = getToolsInfo();\n\n if (hasToolsJson) {\n displayToolsJson(tools, true);\n } else if (formatTable) {\n displayToolsTable(tools);\n } else {\n displayToolsJson(tools, false);\n }\n\n process.exit(0);\n}\n\ninterface NPMConfig {\n token: string;\n username: string;\n email: string;\n registry: string;\n scope?: string;\n defaultPackage?: string;\n}\n\ninterface PackageInfo {\n name: string;\n version: string;\n description?: string;\n author?: string;\n license?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n keywords?: string[];\n homepage?: string;\n repository?: any;\n bugs?: any;\n publishedAt?: string;\n downloads?: number;\n}\n\ninterface PublishResult {\n success: boolean;\n packageName: string;\n version: string;\n message: string;\n registryUrl?: string;\n}\n\nclass NPMJAEGISMCPServer {\n private server: Server;\n private config: NPMConfig;\n\n constructor() {\n this.config = this.loadConfig();\n this.validateConfiguration();\n\n this.server = new Server(\n {\n name: 'npm-jaegis-mcp-server',\n version: '1.0.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n this.setupToolHandlers();\n this.setupErrorHandling();\n }\n\n private loadConfig(): NPMConfig {\n // Do NOT hard-fail on missing credentials so tools/list always works in clients.\n // Auth is validated lazily in the specific tool handlers that need it.\n const token = process.env.NPM_TOKEN || '';\n const username = process.env.NPM_USERNAME || '';\n const email = process.env.NPM_EMAIL || '';\n\n return {\n token,\n username,\n email,\n registry: process.env.NPM_REGISTRY || 'https://registry.npmjs.org/',\n scope: process.env.NPM_SCOPE,\n defaultPackage: process.env.DEFAULT_PACKAGE || 'JAEGIS-web-os'\n };\n }\n\n private validateConfiguration(): void {\n if (this.config.token && !this.config.token.startsWith('npm_')) {\n console.warn('Warning: NPM token format may be invalid. Expected format: npm_*');\n }\n if (!this.config.username || !this.config.email || !this.config.token) {\n console.warn('NPM credentials are not fully set; auth-required tools may fail until provided.');\n }\n\n console.error(`NPM MCP Server configured for user: ${sanitizeCredential(this.config.username || 'unknown')}`);\n console.error(`Registry: ${this.config.registry}`);\n console.error(`Default package: ${this.config.defaultPackage}`);\n }\n\n private setupToolHandlers(): void {\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n\n {\n name: 'npm_package_info',\n description: 'Get detailed information about an NPM package',\n inputSchema: {\n type: 'object',\n properties: {\n package_name: {\n type: 'string',\n description: 'Name of the NPM package'\n },\n version: {\n type: 'string',\n description: 'Specific version (optional, defaults to latest)'\n }\n },\n required: ['package_name']\n }\n },\n {\n name: 'npm_search_packages',\n description: 'Search for NPM packages',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query'\n },\n limit: {\n type: 'number',\n description: 'Maximum number of results (default: 20)'\n }\n },\n required: ['query']\n }\n },\n {\n name: 'npm_publish_package',\n description: 'Publish a package to NPM registry with authentication',\n inputSchema: {\n type: 'object',\n properties: {\n package_path: {\n type: 'string',\n description: 'Path to package directory containing package.json'\n },\n tag: {\n type: 'string',\n description: 'Distribution tag (default: latest)'\n },\n access: {\n type: 'string',\n enum: ['public', 'restricted'],\n description: 'Package access level (default: public)'\n },\n additional_flags: {\n type: 'string',\n description: 'Additional npm publish flags (optional, e.g., \"--dry-run\")'\n }\n },\n required: ['package_path']\n }\n },\n {\n name: 'npm_unpublish_package',\n description: 'Unpublish a package version from NPM',\n inputSchema: {\n type: 'object',\n properties: {\n package_name: {\n type: 'string',\n description: 'Name of the package to unpublish'\n },\n version: {\n type: 'string',\n description: 'Specific version to unpublish (optional, unpublishes entire package if not specified)'\n }\n },\n required: ['package_name']\n }\n },\n {\n name: 'npm_deprecate_package',\n description: 'Deprecate a package version',\n inputSchema: {\n type: 'object',\n properties: {\n package_name: {\n type: 'string',\n description: 'Name of the package'\n },\n version: {\n type: 'string',\n description: 'Version range to deprecate'\n },\n message: {\n type: 'string',\n description: 'Deprecation message'\n }\n },\n required: ['package_name', 'version', 'message']\n }\n },\n {\n name: 'npm_list_versions',\n description: 'List all versions of a package',\n inputSchema: {\n type: 'object',\n properties: {\n package_name: {\n type: 'string',\n description: 'Name of the package'\n }\n },\n required: ['package_name']\n }\n },\n {\n name: 'npm_download_stats',\n description: 'Get download statistics for a package',\n inputSchema: {\n type: 'object',\n properties: {\n package_name: {\n type: 'string',\n description: 'Name of the package'\n },\n period: {\n type: 'string',\n enum: ['last-day', 'last-week', 'last-month', 'last-year'],\n description: 'Time period for stats (default: last-month)'\n }\n },\n required: ['package_name']\n }\n },\n {\n name: 'npm_validate_package',\n description: 'Validate package.json and check for publishing readiness',\n inputSchema: {\n type: 'object',\n properties: {\n package_path: {\n type: 'string',\n description: 'Path to package directory'\n }\n },\n required: ['package_path']\n }\n },\n {\n name: 'health_check',\n description: 'Return server health, version, uptime, and dependency status',\n inputSchema: { type: 'object', properties: {} }\n }\n ] as Tool[]\n };\n });\n\n this.server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n case 'npm_package_info':\n return await this.getPackageInfo(args);\n case 'npm_search_packages':\n return await this.searchPackages(args);\n case 'npm_publish_package':\n return await this.publishPackage(args);\n case 'npm_unpublish_package':\n return await this.unpublishPackage(args);\n case 'npm_deprecate_package':\n return await this.deprecatePackage(args);\n case 'npm_list_versions':\n return await this.listVersions(args);\n case 'npm_download_stats':\n return await this.getDownloadStats(args);\n case 'npm_validate_package':\n return await this.validatePackage(args);\n case 'security_check':\n return await this.securityCheck(args);\n case 'health_check': {\n const version = (() => { try { return JSON.parse(fs.readFileSync(path.resolve(__dirname, '..', 'package.json'), 'utf8')).version } catch { return 'unknown' } })();\n const uptime = process.uptime();\n return { content: [{ type: 'text', text: JSON.stringify({ status: 'ok', version, uptime, success: true }) }] };\n }\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n });\n }\n\n private setupErrorHandling(): void {\n this.server.onerror = (error) => {\n console.error('[NPM MCP Server Error]', error);\n };\n\n process.on('SIGINT', async () => {\n await this.server.close();\n process.exit(0);\n });\n }\n\n // Tool implementations\n private async getPackageInfo(args: any) {\n try {\n const packageName = args.package_name;\n if (!packageName) throw new Error('package_name is required');\n\n const url = `${this.config.registry}${packageName}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Package not found: ${packageName}`);\n }\n\n const data = await response.json() as any;\n const version = args.version || 'latest';\n const versionData = version === 'latest' ? data['dist-tags']?.latest : version;\n const packageData = data.versions?.[versionData] || data;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n name: data.name,\n version: packageData.version,\n description: data.description,\n author: data.author,\n license: data.license,\n homepage: data.homepage,\n repository: data.repository,\n keywords: data.keywords,\n dependencies: packageData.dependencies,\n devDependencies: packageData.devDependencies,\n downloads: data.downloads,\n lastPublished: data.time?.modified,\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async searchPackages(args: any) {\n try {\n const query = args.query;\n const limit = Math.min(args.limit || 20, 100);\n\n if (!query) throw new Error('query is required');\n\n const url = `${this.config.registry}-/v1/search?text=${encodeURIComponent(query)}&size=${limit}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error('Search failed');\n }\n\n const data = await response.json() as any;\n const results = data.objects?.map((obj: any) => ({\n name: obj.package.name,\n version: obj.package.version,\n description: obj.package.description,\n date: obj.package.date,\n links: obj.package.links\n })) || [];\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n query,\n total: data.total,\n results,\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async publishPackage(args: any) {\n try {\n const packagePath = args.package_path;\n if (!packagePath) throw new Error('package_path is required');\n if (!this.config.token) throw new Error('NPM_TOKEN environment variable is required');\n\n const packageJsonPath = path.join(packagePath, 'package.json');\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`package.json not found at ${packageJsonPath}`);\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n const tag = args.tag || 'latest';\n const access = args.access || 'public';\n const additionalFlags = args.additional_flags || '';\n\n // Validate package before publishing\n const validationIssues: string[] = [];\n if (!packageJson.name) validationIssues.push('Missing required field: name');\n if (!packageJson.version) validationIssues.push('Missing required field: version');\n if (!semver.valid(packageJson.version)) validationIssues.push('Invalid version format (must be semver)');\n\n if (validationIssues.length > 0) {\n throw new Error(`Package validation failed: ${validationIssues.join('; ')}`);\n }\n\n // ==================== STRICT SECURITY PIPELINE ====================\n\n // 1. Pre-flight Version Conflict Check\n console.error('[Security] Step 1/5: Checking for version conflicts...');\n const { checkVersionConflictAsync } = require(path.join(__dirname, '../../../scripts/registry_manager.js'));\n const versionConflict = await checkVersionConflictAsync(packageJson.name, packageJson.version, 'npm');\n if (versionConflict) {\n throw new Error(`Version ${packageJson.version} already exists on NPM registry. Aborting to prevent conflicts.`);\n }\n console.error('[Security] ā Version available');\n\n // 2. Smart README Maintenance/Generation\n console.error('[Security] Step 2/5: Checking README...');\n const { smartReadmeUpdate } = require(path.join(__dirname, '../../../scripts/professional_readme_generator.js'));\n await smartReadmeUpdate(packagePath, {\n name: packageJson.name,\n version: packageJson.version,\n description: packageJson.description,\n author: packageJson.author,\n license: packageJson.license,\n repository: packageJson.repository?.url || packageJson.repository,\n homepage: packageJson.homepage,\n keywords: packageJson.keywords || [],\n tools: [],\n examples: []\n }, 'npm');\n console.error('[Security] ā README validated');\n\n // 3. Local Security Scan\n console.error('[Security] Step 3/5: Deep security scan...');\n const scanResult = await scanDirectory(packagePath);\n if (!scanResult.passed) {\n throw new Error(`Security check failed: ${scanResult.issues.join('; ')}`);\n }\n console.error('[Security] ā No sensitive data detected');\n\n // 4. Build Artifact Sanitization\n console.error('[Security] Step 4/5: Sanitizing build artifacts...');\n const { sanitizeNpmPackage } = require(path.join(__dirname, '../../../scripts/artifact_sanitizer.js'));\n const sanitizationResult = await sanitizeNpmPackage(packagePath);\n if (sanitizationResult.success && !sanitizationResult.clean) {\n console.error(`[Security] ā Sanitized ${sanitizationResult.report.filesModified} files`);\n }\n console.error('[Security] ā Artifacts clean');\n\n // 5. Retroactive Historical Scan (async, non-blocking)\n console.error('[Security] Step 5/5: Triggering historical scan (async)...');\n const { scanNpmPackageHistory, autoRemediateNpm } = require(path.join(__dirname, '../../../scripts/npm_historical_scanner.js'));\n // Run in background, don't wait\n setImmediate(async () => {\n try {\n console.error(`[Historical Scan] Scanning ${packageJson.name} history...`);\n const historicalResults = await scanNpmPackageHistory(packageJson.name, { limit: 10 });\n if (historicalResults.compromisedVersions.length > 0) {\n console.error(`[Historical Scan] ā Found ${historicalResults.compromisedVersions.length} compromised versions`);\n await autoRemediateNpm(packageJson.name, historicalResults);\n } else {\n console.error('[Historical Scan] ā All historical versions clean');\n }\n } catch (e) {\n console.error(`[Historical Scan] Error: ${(e as Error).message}`);\n }\n });\n console.error('[Security] ā Historical scan queued');\n\n console.error('[Security] ==================== ALL CHECKS PASSED ====================');\n\n // Setup NPM authentication environment\n const publishEnv = {\n ...process.env,\n NPM_TOKEN: this.config.token,\n NPM_CONFIG_REGISTRY: this.config.registry,\n NPM_CONFIG__AUTH_TOKEN: this.config.token,\n NPM_CONFIG_USERCONFIG: path.join(os.homedir(), '.npmrc')\n };\n\n // Build npm publish command\n const publishArgs = ['publish', '--access', access, '--tag', tag];\n if (additionalFlags) {\n publishArgs.push(...additionalFlags.split(' '));\n }\n\n console.error(`[NPM Publish] Executing: npm ${publishArgs.join(' ')} in ${packagePath}`);\n console.error(`[NPM Publish] Package: ${packageJson.name}@${packageJson.version}`);\n\n // Execute npm publish command with interactive handling\n const publishOutput = await new Promise<string>((resolve, reject) => {\n const child = spawn('npm', publishArgs, {\n cwd: packagePath,\n env: publishEnv,\n stdio: ['pipe', 'pipe', 'pipe']\n });\n\n let output = '';\n let errorOutput = '';\n\n child.stdout.on('data', (data) => {\n const str = data.toString();\n output += str;\n console.error(`[NPM] ${str}`);\n\n // Check for auth URL\n const urlMatch = str.match(/https:\\/\\/www\\.npmjs\\.com\\/auth\\/cli\\/[a-f0-9-]+/);\n if (urlMatch) {\n const url = urlMatch[0];\n console.error(`[NPM] Auth URL detected: ${url}`);\n // Open URL automatically\n try {\n const startCmd = process.platform === 'win32' ? 'start' : (process.platform === 'darwin' ? 'open' : 'xdg-open');\n require('child_process').exec(`${startCmd} ${url}`);\n } catch (e) {\n console.error('Failed to open browser automatically');\n }\n // Press Enter to continue\n if (child.stdin) {\n child.stdin.write('\\n');\n }\n }\n });\n\n child.stderr.on('data', (data) => {\n const str = data.toString();\n errorOutput += str;\n console.error(`[NPM Error] ${str}`);\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve(output);\n } else {\n reject(new Error(`npm publish failed with code ${code}: ${errorOutput}`));\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n\n console.error(`[NPM Publish] Success: ${packageJson.name}@${packageJson.version}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: true,\n message: `Successfully published ${packageJson.name}@${packageJson.version} to NPM registry`,\n package: packageJson.name,\n version: packageJson.version,\n tag,\n access,\n registry: this.config.registry,\n publishOutput: publishOutput.substring(0, 500), // Limit output size\n timestamp: new Date().toISOString()\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[NPM Publish Error] ${errorMessage}`);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n success: false,\n error: errorMessage,\n timestamp: new Date().toISOString()\n }, null, 2)\n }\n ],\n isError: true\n };\n }\n }\n\n private async securityCheck(args: any) {\n try {\n const dirPath = args.path;\n if (!dirPath) throw new Error('path is required');\n\n const result = await scanDirectory(dirPath);\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n operation: 'security_check',\n path: dirPath,\n ...result,\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async unpublishPackage(args: any) {\n try {\n const packageName = args.package_name;\n if (!packageName) throw new Error('package_name is required');\n if (!this.config.token) throw new Error('NPM_TOKEN environment variable is required');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n message: `Unpublish request for ${packageName}${args.version ? `@${args.version}` : ' (all versions)'}. This is a destructive operation.`,\n package: packageName,\n version: args.version || 'all',\n warning: 'Unpublishing is irreversible. Use npm unpublish command to complete.',\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async deprecatePackage(args: any) {\n try {\n const packageName = args.package_name;\n const version = args.version;\n const message = args.message;\n\n if (!packageName || !version || !message) {\n throw new Error('package_name, version, and message are all required');\n }\n if (!this.config.token) throw new Error('NPM_TOKEN environment variable is required');\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n message: `Deprecation request for ${packageName}@${version}`,\n package: packageName,\n version,\n deprecationMessage: message,\n warning: 'Use npm deprecate command to complete this action.',\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async listVersions(args: any) {\n try {\n const packageName = args.package_name;\n if (!packageName) throw new Error('package_name is required');\n\n const url = `${this.config.registry}${packageName}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Package not found: ${packageName}`);\n }\n\n const data = await response.json() as any;\n const versions = Object.keys(data.versions || {}).sort((a, b) => {\n try {\n return semver.compare(b, a);\n } catch {\n return b.localeCompare(a);\n }\n });\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n package: packageName,\n totalVersions: versions.length,\n versions,\n latest: data['dist-tags']?.latest,\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async getDownloadStats(args: any) {\n try {\n const packageName = args.package_name;\n const period = args.period || 'last-month';\n\n if (!packageName) throw new Error('package_name is required');\n\n const url = `https://api.npmjs.org/downloads/point/${period}/${packageName}`;\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch download stats for ${packageName}`);\n }\n\n const data = await response.json() as any;\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n package: packageName,\n period,\n downloads: data.downloads,\n start: data.start,\n end: data.end,\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n private async validatePackage(args: any) {\n try {\n const packagePath = args.package_path;\n if (!packagePath) throw new Error('package_path is required');\n\n const packageJsonPath = path.join(packagePath, 'package.json');\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error(`package.json not found at ${packageJsonPath}`);\n }\n\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));\n const issues: string[] = [];\n\n // Validate required fields\n if (!packageJson.name) issues.push('Missing required field: name');\n if (!packageJson.version) issues.push('Missing required field: version');\n if (!packageJson.description) issues.push('Missing recommended field: description');\n if (!packageJson.author) issues.push('Missing recommended field: author');\n if (!packageJson.license) issues.push('Missing recommended field: license');\n if (!packageJson.repository) issues.push('Missing recommended field: repository');\n\n // Validate name format\n if (packageJson.name && !/^(@[a-z0-9-~][a-z0-9-._~]*\\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(packageJson.name)) {\n issues.push('Invalid package name format');\n }\n\n // Validate version format\n if (packageJson.version && !semver.valid(packageJson.version)) {\n issues.push('Invalid version format (must be semver)');\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n package: packageJson.name,\n version: packageJson.version,\n isValid: issues.length === 0,\n issues,\n warnings: issues.length > 0 ? 'Fix issues before publishing' : 'Package is ready to publish',\n success: true\n }, null, 2)\n }\n ]\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n success: false\n }, null, 2)\n }\n ]\n };\n }\n }\n\n async run(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n\n // Display startup summary\n const tools = getToolsInfo();\n const categories = tools.reduce((acc, tool) => {\n acc[tool.category] = (acc[tool.category] || 0) + 1;\n return acc;\n }, {} as Record<string, number>);\n\n console.error('š¦ NPM JAEGIS MCP Server (v1.0.0) running on stdio');\n console.error(`š Total Tools: ${tools.length} | Categories: ${Object.keys(categories).length}`);\n console.error(`š§ Configured for user: ${sanitizeCredential(this.config.username)}`);\n console.error(`š Registry: ${this.config.registry}`);\n console.error('ā
Server ready with NPM package management tools');\n console.error('š” Use --list-tools to see all available tools');\n }\n}\n\n// Run the server\nif (require.main === module) {\n try {\n const server = new NPMJAEGISMCPServer();\n server.run().catch((error) => {\n console.error('Failed to start NPM JAEGIS MCP Server:', error.message);\n process.exit(1);\n });\n } catch (error) {\n console.error('Failed to initialize NPM JAEGIS MCP Server:');\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n}\n","import * as fs from 'fs';\r\nimport * as path from 'path';\r\n\r\nexport interface SecurityScanResult {\r\n passed: boolean;\r\n issues: string[];\r\n warnings: string[];\r\n}\r\n\r\nconst SENSITIVE_FILES = [\r\n '.env',\r\n '.env.local',\r\n '.env.production',\r\n '.env.development',\r\n 'id_rsa',\r\n 'id_dsa',\r\n 'id_ed25519',\r\n '*.pem',\r\n '*.key',\r\n '*.p12',\r\n '*.pfx',\r\n 'npm-debug.log',\r\n 'yarn-error.log',\r\n '.npmrc',\r\n '.pypirc',\r\n 'secrets.json',\r\n 'credentials.json'\r\n];\r\n\r\nconst IGNORED_DIRS = [\r\n 'node_modules',\r\n '.git',\r\n '.svn',\r\n '.hg',\r\n 'dist',\r\n 'build',\r\n 'coverage',\r\n '__pycache__',\r\n '.pytest_cache',\r\n '.mypy_cache',\r\n 'logs',\r\n 'cache',\r\n 'tmp',\r\n 'temp'\r\n];\r\n\r\nconst SENSITIVE_PATTERNS = [\r\n { name: 'AWS Access Key', regex: /AKIA[0-9A-Z]{16}/ },\r\n { name: 'Generic Private Key', regex: /-----BEGIN PRIVATE KEY-----/ },\r\n { name: 'Generic API Key', regex: /(api_key|apikey|secret|token)[\\s]*[:=][\\s]*['\"][a-zA-Z0-9_\\-]{20,}['\"]/i },\r\n { name: 'GitHub Token', regex: /gh[pousr]_[a-zA-Z0-9]{36}/ },\r\n { name: 'NPM Token', regex: /npm_[a-zA-Z0-9]{36}/ },\r\n { name: 'Slack Token', regex: /xox[baprs]-([0-9a-zA-Z]{10,48})/ }\r\n];\r\n\r\nexport async function scanDirectory(dirPath: string): Promise<SecurityScanResult> {\r\n const issues: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n try {\r\n const files = await getAllFiles(dirPath);\r\n\r\n for (const file of files) {\r\n const relativePath = path.relative(dirPath, file);\r\n const fileName = path.basename(file);\r\n\r\n // Check filename against sensitive patterns\r\n if (SENSITIVE_FILES.some(pattern => {\r\n if (pattern.startsWith('*')) return fileName.endsWith(pattern.slice(1));\r\n return fileName === pattern;\r\n })) {\r\n issues.push(`Sensitive file found: ${relativePath}`);\r\n }\r\n\r\n // Scan content for secrets (skip large files and binaries)\r\n try {\r\n const stats = fs.statSync(file);\r\n if (stats.size < 1024 * 1024) { // 1MB limit\r\n const content = fs.readFileSync(file, 'utf8');\r\n // Simple check for binary content (null bytes)\r\n if (!content.includes('\\0')) {\r\n for (const pattern of SENSITIVE_PATTERNS) {\r\n if (pattern.regex.test(content)) {\r\n // Don't include the actual secret in the output\r\n issues.push(`Potential ${pattern.name} found in: ${relativePath}`);\r\n }\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n // Ignore read errors (permissions, etc)\r\n }\r\n }\r\n } catch (error) {\r\n issues.push(`Failed to scan directory: ${error instanceof Error ? error.message : String(error)}`);\r\n }\r\n\r\n return {\r\n passed: issues.length === 0,\r\n issues,\r\n warnings\r\n };\r\n}\r\n\r\nasync function getAllFiles(dir: string): Promise<string[]> {\r\n const files: string[] = [];\r\n\r\n async function traverse(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (IGNORED_DIRS.includes(entry.name)) continue;\r\n\r\n if (entry.isDirectory()) {\r\n await traverse(fullPath);\r\n } else {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n\r\n await traverse(dir);\r\n return files;\r\n}\r\n"],"mappings":"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","names":["fs","path","resolve"]}