A Model Context Protocol (MCP) server that brings enterprise-grade code analysis to Claude Desktop and other MCP clients using SonarLint's standalone SLOOP backend.
- 🔍 Real-time Code Analysis - Detect bugs, code smells, and security vulnerabilities
- 🚀 Fast & Standalone - No IDE or SonarQube server required
- 📦 Multiple Languages - JavaScript, TypeScript, Python (265+ JS rules)
- 💾 Session Storage - Results stored in memory for multi-turn conversations
- 🔧 Quick Fixes - Automated suggestions for common issues
- 🎯 Batch Analysis - Analyze multiple files efficiently
- Node.js 22 or higher
- Claude Desktop (or any MCP client)
No installation required! Use npx to run directly:
npx @nielspeter/sonarlint-mcp-serverThe SLOOP backend (~70MB) downloads automatically on first run.
git clone https://github.com/nielspeter/sonarlint-mcp-server.git
cd sonarlint-mcp-server
npm install # Auto-downloads SLOOP backend (~70MB)
npm run buildUse the Claude CLI to add the MCP server:
claude mcp add --transport stdio sonarlint -- npx -y @nielspeter/sonarlint-mcp-serverThis automatically updates your Claude Code configuration. No restart needed!
Add to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"sonarlint": {
"command": "npx",
"args": ["-y", "@nielspeter/sonarlint-mcp-server"]
}
}
}Restart Claude Desktop to apply changes.
Customize SonarLint rules per project by creating a sonarlint.json in your project root:
{
"rules": {
"typescript:S3776": {
"level": "on",
"parameters": {
"threshold": "20"
}
},
"javascript:S1481": {
"level": "off"
}
}
}level:"on"(default) or"off"to enable/disable a ruleparameters: Override rule thresholds and settings (see configurable rules)- Fallback: If no
sonarlint.jsonis found,.sonarlint/settings.jsonis checked (IDE convention)
Copy sonarlint.example.json from this repo as a starting point. Use list_rules to discover available rules and their configurable parameters.
Once configured, Claude can analyze your code:
Analyze my JavaScript file for code quality issues: /path/to/file.js
Check these files for bugs: src/app.ts, src/utils.ts
Analyze this code snippet:
function process(data) {
var result = data; // Issues with 'var'
return result;
}
| Tool | Description |
|---|---|
check_quality |
Check a file for code quality issues |
check_files |
Check multiple files in one call |
check_code |
Check a code snippet (no file on disk needed) |
fix_issue |
Automatically fix one specific issue |
fix_all_issues |
Automatically fix all fixable issues in a file |
list_rules |
List all active code quality rules |
health_check |
Check server status and diagnostics |
{
file: "/path/to/file.js",
language: "javascript",
issues: [
{
line: 4,
column: 2,
severity: "MAJOR",
rule: "javascript:S3504",
message: "Unexpected var, use let or const instead.",
quickFix: {
message: "Replace with 'const'",
edits: [...]
}
}
],
summary: {
total: 5,
critical: 0,
major: 3,
minor: 2
}
}| Language | Extensions | Rules |
|---|---|---|
| JavaScript | .js, .jsx, .mjs, .cjs |
265 |
| TypeScript | .ts, .tsx |
265 |
| Python | .py |
~100 |
Claude Desktop
↓ MCP Protocol (stdio)
SonarLint MCP Server (this project)
↓ JSON-RPC
SLOOP Backend (SonarLint Local Operations)
↓ Plugin API
Language Analyzers (JS/TS, Python)
The server uses SonarLint's standalone SLOOP backend with:
- Version: 10.32.0.82302 (WebStorm-compatible)
- Bundled JRE: Java 17
- Bi-directional RPC: Client request handlers implemented
- Session Storage: Results stored in memory for multi-turn conversations
SLOOP requires a specific initialization sequence. Getting this wrong causes analysis to hang:
- Pre-register files — Store file DTOs in
scopeFilesmap before creating the scope. SLOOP callslistFilessynchronously during scope creation, so files must already be available. - Create scope — Send
addConfigurationScopenotification to SLOOP. - Wait for readiness — SLOOP sends
didChangeAnalysisReadinesswhen the scope is ready. Analysis requests before this point will fail silently. - Analyse — Call
analyzeFilesAndTrackwith the files.
Key design decisions:
- No directory scanning in
listFiles— Only return the specific files requested for analysis. Scanning the project root returned 500+ files on real projects and caused multi-minute hangs. getBaseDirreturns project root — Detected viapackage.json,.git, etc. SLOOP uses this for.gitignorematching and file exclusion patterns.ideRelativePathrelative to project root — SLOOP'sWildcardPattern.matchrequires this; null values cause NPEs.
# Install dependencies (auto-downloads backend)
npm install
# Build
npm run build
# Run tests
npm test
# Watch mode (auto-rebuild)
npm run dev
# Inspect with MCP Inspector
npm run inspect# Run test suite
npm test
# Run with UI
npm run test:ui
# Run with coverage
npm run test:coverageTests validate:
- SLOOP bridge functionality
- File and content analysis
- JavaScript and Python plugin detection
- Quick fix support
- Error handling
- SETUP.md - Detailed installation guide
- TROUBLESHOOTING.md - Common issues and solutions
- docs/configurable-rules.md - All 84 configurable rules with parameters and defaults
- docs/SLOOP_RPC_PROTOCOL.md - Complete RPC protocol documentation
- docs/TESTING.md - Testing guide
This project demonstrates several key technical achievements:
- Standalone SLOOP - First documented standalone use of SonarLint's SLOOP backend
- Bi-directional RPC - Complete client request handler implementation
- MCP Integration - Full Model Context Protocol implementation with resources
- Session Management - Results storage for multi-turn conversations
- Production Ready - Comprehensive testing, error handling, and monitoring
For anyone using SLOOP programmatically:
listFilesmust returnClientFileDtowith file content (not just URIs)isUserDefined: trueis mandatory (SLOOP filters out false values)bundlePathshould be parent directory (SLOOP appends/package/bin/server.cjs)- Client must implement 4 request handlers (listFiles, getBaseDir, etc.)
backendCapabilitiesrequired for proper initialization
- ✅ No IDE dependency - runs completely standalone
- ✅ Full API access - all SLOOP services available
- ✅ Better control - configure for specific needs
- ✅ More reliable - direct process communication
- ✅ CI/CD capable - can run in automated environments
- ✅ Faster - no IDE overhead
We initially investigated connecting to IDE servers (WebStorm port 64120) but discovered:
- IDE server is only for "Open in IDE" from SonarQube Server/Cloud
- Limited API access
- IDE must be running
- Not suitable for programmatic access
- SonarQube MCP Server - Official server for SonarQube Server/Cloud APIs
- Complementary approach requiring server setup
- This project provides local, standalone analysis
Contributions welcome! Areas for improvement:
- Additional language support (Java, Go, PHP)
- Custom rule development
- Performance optimizations
- CI/CD integrations
MIT License - see LICENSE
- SonarSource for building SLOOP and SonarLint
- Anthropic for the Model Context Protocol
- Claude Code for enabling this development
Status: ✅ Production Ready - All phases complete with comprehensive testing