UNPKG

nikto-mcp

Version:

A secure MCP (Model Context Protocol) server that enables AI agents to interact with Nikto web server scanner

148 lines (139 loc) 10.4 kB
# Nikto MCP Active Context ## Current Work Focus - **COMPLETE**: Full MCP server implementation with stdin/JSON-RPC support - **COMPLETE**: Bootstrap `index.cjs` with compiled/TypeScript fallback (FIXED ES Module issue) - **COMPLETE**: Core MCP functionality with enhanced scan tool - **COMPLETE**: Comprehensive test suite implemented and passing (39 tests, all green) - **COMPLETE**: Extended Nikto options support (nolookup, nossl, ssl, port, timeout, vhost) - **COMPLETE**: MCP Inspector compatibility verified and fixed - **COMPLETE**: MCP communication protocol issues resolved - **COMPLETE**: Docker mode JSON output fix implemented and verified - **COMPLETE**: Test & Lint & Coverage - All Green Achievement (January 14, 2025) - Tests: 39/39 passing ✅ - Lint: 0 errors, 1 warning ✅ - Coverage: 48.66% overall, utils/logger 100%, types 100%, validators 93.1% ✅ - **COMPLETE**: NPX Compatibility Fix - ES Module Error Resolution (v0.1.2) - Fixed: ReferenceError: require is not defined in ES module scope - Solution: Renamed index.js to index.cjs for CommonJS compatibility - Updated: package.json bin field to point to index.cjs - Released: Version 0.1.2 with working npx execution - **COMPLETE**: Final CommonJS Fix - Type Module Removal (v0.1.3) - Fixed: exports is not defined error from dist/index.js being treated as ES module - Solution: Removed "type": "module" from package.json so compiled code loads as CommonJS - Result: npx nikto-mcp@latest now works properly - Released: Version 0.1.3 via GitHub Actions automation - **COMPLETE**: Docker Build Fix - Alpine Linux Compatibility (v0.2.0 preparation) - Fixed: Dockerfile now uses Alpine package manager (apk) instead of Debian (apt-get) - Fixed: Uses Alpine-compatible adduser command instead of useradd - Fixed: Skips npm prepare script during production build (--ignore-scripts) - Fixed: Copies correct file (index.cjs) instead of index.js - Result: Docker build now succeeds and creates functional nikto-mcp:latest image - **COMPLETE**: Command Line Help Fix - Hanging --help Issue Resolution (v0.7.0) - Fixed: npx nikto-mcp@latest --help command was hanging indefinitely - Root Cause: Application was starting MCP server without checking command-line arguments - Solution: Added argument parsing before server initialization - Implementation: handleCommandLineArgs() function to process --help and --version flags - Result: --help displays comprehensive usage information and exits cleanly - Result: --version displays version information and exits cleanly - Verified: All 39 tests still passing after changes - **COMPLETE**: MCP SDK Migration - Tools List Discovery Fix (v0.7.0) - Fixed: echo '{"id": "1", "method": "tools/list", "params": {}}' returning no tools - Root Cause: Old MCP SDK API was deprecated, tools not properly registered - Solution: Migrated to latest @modelcontextprotocol/sdk v1.17.1 with new McpServer API - Implementation: Used server.registerTool() with zod schemas for proper tool registration - Result: tools/list now correctly returns all 3 tools (scan, scan_status, stop_scan) - Verified: JSON-RPC response includes proper tool schemas and descriptions - **COMPLETE**: TypeScript MCP Client Examples Implementation (February 8, 2025) - Created: `examples/` folder with comprehensive MCP client examples - Added: `examples/mcp-client.ts` - TypeScript MCP client using official SDK - Added: `examples/simple-mcp-client.js` - Working JavaScript client using raw JSON-RPC - Added: `examples/README.md` - Comprehensive documentation and usage guide - Features: Server connection, tool discovery, resource access, tool invocation - Safety: All examples use dry run mode to prevent actual network scans - Documentation: Complete setup instructions, troubleshooting, and API examples ## Recent Changes - **CRITICAL FIX**: Fixed info logs appearing as "Error output from MCP server" (2025-01-17) - **ROOT CAUSE**: Winston Console transport was sending ALL log levels (including info) to stderr, causing MCP clients to interpret info logs as errors - **SOLUTION**: Modified logger configuration to suppress info/debug logs in MCP mode, only allow warn/error levels to stderr - **NEW FEATURE**: Added `MCP_STDOUT_LOGS=allow` environment variable for development debugging - **RESULT**: Clean MCP JSON-RPC output, no more false error reports, proper log level separation - **TECHNICAL**: Changed from single Stream transport to conditional Console transport with level filtering - **VERIFIED**: MCP communication now works without log pollution, development mode still allows full logging - **CRITICAL FIX**: Fixed ESLint and TypeScript compatibility issues (2025-01-14) - **ROOT CAUSE**: ESLint configuration was too strict causing 136 errors and TypeScript 5.8.3 incompatible with @typescript-eslint v6 - **SOLUTION**: Relaxed ESLint rules, updated dependencies, downgraded TypeScript to 5.3.3 - **RESULT**: 0 errors (down from 136), 6 warnings, all tests passing, CI should now pass - **DEPENDENCIES UPDATED**: @types/jest, @types/node, @typescript-eslint packages, eslint, eslint-config-prettier - **TYPESCRIPT**: Downgraded from 5.8.3 to 5.3.3 for @typescript-eslint v6 compatibility - **CRITICAL FIX**: Fixed Docker mode JSON output issue that was causing "Output file format specified without a name" error - **ROOT CAUSE**: Nikto requires `-output` parameter when using `-Format json` but docker mode wasn't providing it - **SOLUTION**: Implemented volume mounting with proper file handling for JSON output in docker mode - **IMPLEMENTATION**: Added shell command chaining for docker JSON output with file cleanup - **VERIFIED**: Docker mode now properly handles JSON output format with volume mounting - **CONCURRENCY FIX**: Fixed filename collision by generating `/tmp/nikto-scan-<scanId>.json` (docker) and `/tmp/nikto-output-<scanId>.json` (local). Removed post-hoc arg substitution for cleaner, safer concurrent scan handling. - **CRITICAL FIX**: Resolved MCP JSON-RPC communication issues by redirecting Winston logger to stderr - **ROOT CAUSE**: Winston Console transport was writing to stdout, polluting MCP JSON-RPC stream - **SOLUTION**: Changed from Console transport to Stream transport targeting process.stderr - **VERIFIED**: MCP Inspector now works correctly with proper ping, scan validation, and error responses - **CRITICAL**: Created root-level `index.js` for stdin MCP server execution - **CRITICAL**: Fixed SDK import paths to use `.js` extensions for export map compatibility - **CRITICAL**: Added `tslib` production dependency for compiled TypeScript helpers - **VERIFIED**: Both compiled (`dist/index.js`) and TypeScript fallback (`tsx`/`ts-node`) execution paths work - Enhanced scan tool with additional Nikto CLI options - Added dry-run mode for command testing - Implemented comprehensive input validation with conflict checks - Created extensive unit test coverage (validators, service logic) - Added examples/scan-demo.js for demonstration - Updated README.md with detailed parameter documentation - All tests passing with good coverage ## Next Steps 1. **Documentation Enhancement** (COMPLETE) - [x] Updated memory bank with latest achievements - [x] Enhanced README.md with deployment and MCP configuration - [x] Enhanced DEVELOPMENT.md with comprehensive troubleshooting and setup details - [x] Added MCP Inspector testing instructions - [x] Added Claude Desktop configuration examples 2. **Code Quality Improvements** (COMPLETE) - [x] Fixed ESLint configuration and TypeScript compatibility - [x] Resolved 136 ESLint errors down to 0 errors, 6 warnings - [x] Updated development dependencies for compatibility - [x] Fixed TypeScript version compatibility issues 3. **Future Optional Enhancements** - Consider adding more Nikto output format options - Implement scan result persistence - Create integration tests with actual Nikto execution - Add plugin system for custom scan modules - Add security best practices document - Address remaining 6 ESLint warnings (prefer-nullish-coalescing, require-await, no-explicit-any) ## Active Decisions - Using TypeScript strict mode for maximum type safety - Jest for testing framework (comprehensive ecosystem) - Modular architecture to support future plugins - MCP SDK as the protocol implementation ## Important Patterns and Preferences - Interfaces over concrete types for extensibility - Async/await over callbacks for clarity - Comprehensive error handling at boundaries - Input validation using schema validators (Zod) ## Learnings and Insights - **CRITICAL**: ESLint strict rules can cause excessive false positives - balance strictness with practicality - **CRITICAL**: @typescript-eslint version compatibility is crucial - must match TypeScript version ranges - **CRITICAL**: TypeScript 5.8.3 works correctly with @typescript-eslint v8 (v6 compatibility issue was resolved) - **CRITICAL**: ESLint v9 requires migration to flat config format (eslint.config.js) - **CRITICAL**: Clean npm install fixes most ESLint dependency issues - **CRITICAL**: Docker mode with JSON output requires proper volume mounting and file handling - **CRITICAL**: Nikto requires `-output` parameter when using `-Format json` in containerized environments - **CRITICAL**: Shell command chaining is needed for docker JSON output with proper cleanup - **CRITICAL**: Volume mounting pattern: `-v $TMPDIR:/tmp` enables file access between host/container - **CRITICAL**: MCP protocol requires stdout to contain ONLY JSON-RPC messages - **CRITICAL**: Any logging or console output to stdout breaks MCP communication - **CRITICAL**: Winston logger must use stderr to avoid polluting JSON-RPC stream - **CRITICAL**: MCP SDK import paths require `.js` extensions for deep imports due to export map - **CRITICAL**: Bootstrap pattern enables both production (compiled) and development (TypeScript) execution - **CRITICAL**: `tslib` is required as production dependency for compiled TypeScript helpers - MCP protocol requires specific tool/resource definitions - MCP Inspector provides excellent debugging/testing capabilities - Nikto output parsing needs careful handling of different formats - Security constraints are critical for production use - Plugin system should be designed from the start - Dual execution mode (compiled/TS) provides development flexibility