@nielspeter/sonarlint-mcp-server 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +6 -12
- package/package.json +3 -2
- package/scripts/setup-sonarlint.sh +115 -39
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [0.2.2](https://github.com/nielspeter/sonarlint-mcp-server/compare/v0.2.1...v0.2.2) (2026-03-28)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* add robust extraction and validation to setup script ([efb737e](https://github.com/nielspeter/sonarlint-mcp-server/commit/efb737e4bc9bb5a74c24a5dafe7df46f05e395d9))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* add bin entry matching package name for npx compatibility ([e4f4220](https://github.com/nielspeter/sonarlint-mcp-server/commit/e4f422029af47cdef3546a94bfc8734b6db7db7a))
|
|
16
|
+
* correct tarball extraction and update Python plugin version ([c1cbe3a](https://github.com/nielspeter/sonarlint-mcp-server/commit/c1cbe3acaf05e04827c4da2ac28b51ff09357ce0))
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
### Documentation
|
|
20
|
+
|
|
21
|
+
* Clarify Claude Code vs Claude Desktop configuration and remove unnecessary global install option ([394f943](https://github.com/nielspeter/sonarlint-mcp-server/commit/394f9439eca6388f11034782d17b93d296802ea2))
|
|
22
|
+
|
|
5
23
|
### [0.2.1](https://github.com/nielspeter/sonarlint-mcp-server/compare/v0.2.0...v0.2.1) (2025-11-12)
|
|
6
24
|
|
|
7
25
|
|
package/README.md
CHANGED
|
@@ -31,13 +31,7 @@ npx @nielspeter/sonarlint-mcp-server
|
|
|
31
31
|
|
|
32
32
|
The SLOOP backend (~70MB) downloads automatically on first run.
|
|
33
33
|
|
|
34
|
-
####
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
npm install -g @nielspeter/sonarlint-mcp-server
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
#### Or from source (for development):
|
|
34
|
+
#### From Source (for development):
|
|
41
35
|
|
|
42
36
|
```bash
|
|
43
37
|
git clone https://github.com/nielspeter/sonarlint-mcp-server.git
|
|
@@ -46,17 +40,17 @@ npm install # Auto-downloads SLOOP backend (~70MB)
|
|
|
46
40
|
npm run build
|
|
47
41
|
```
|
|
48
42
|
|
|
49
|
-
### Configure Claude
|
|
43
|
+
### Configure with Claude Code
|
|
50
44
|
|
|
51
|
-
|
|
45
|
+
Use the Claude CLI to add the MCP server:
|
|
52
46
|
|
|
53
47
|
```bash
|
|
54
48
|
claude mcp add --transport stdio sonarlint -- npx -y @nielspeter/sonarlint-mcp-server
|
|
55
49
|
```
|
|
56
50
|
|
|
57
|
-
This automatically updates your Claude
|
|
51
|
+
This automatically updates your Claude Code configuration. No restart needed!
|
|
58
52
|
|
|
59
|
-
|
|
53
|
+
### Configure with Claude Desktop
|
|
60
54
|
|
|
61
55
|
Add to your `claude_desktop_config.json`:
|
|
62
56
|
|
|
@@ -75,7 +69,7 @@ Add to your `claude_desktop_config.json`:
|
|
|
75
69
|
}
|
|
76
70
|
```
|
|
77
71
|
|
|
78
|
-
Restart Claude Desktop
|
|
72
|
+
Restart Claude Desktop to apply changes.
|
|
79
73
|
|
|
80
74
|
## Usage
|
|
81
75
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nielspeter/sonarlint-mcp-server",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "MCP server providing SonarLint code analysis for Claude Desktop and other MCP clients",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -32,7 +32,8 @@
|
|
|
32
32
|
"release:patch": "standard-version --release-as patch"
|
|
33
33
|
},
|
|
34
34
|
"bin": {
|
|
35
|
-
"sonarlint-mcp": "./dist/index.js"
|
|
35
|
+
"sonarlint-mcp": "./dist/index.js",
|
|
36
|
+
"sonarlint-mcp-server": "./dist/index.js"
|
|
36
37
|
},
|
|
37
38
|
"files": [
|
|
38
39
|
"dist",
|
|
@@ -8,19 +8,21 @@ VERSION="10.32.0.82302"
|
|
|
8
8
|
BACKEND_DIR="./sonarlint-backend"
|
|
9
9
|
MAVEN_BASE="https://repo1.maven.org/maven2/org/sonarsource/sonarlint/core/sonarlint-backend-cli/${VERSION}"
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
JS_PLUGIN_VERSION="11.3.0.34350"
|
|
12
|
+
PYTHON_PLUGIN_VERSION="5.16.0.29940"
|
|
13
|
+
|
|
14
|
+
echo "Setting up SonarLint Backend v${VERSION}..."
|
|
12
15
|
echo ""
|
|
13
16
|
|
|
14
|
-
# Check if already installed
|
|
15
17
|
if [ -d "$BACKEND_DIR/lib" ] && [ -d "$BACKEND_DIR/jre" ] && [ -d "$BACKEND_DIR/plugins" ]; then
|
|
16
|
-
echo "
|
|
18
|
+
echo "SonarLint backend already installed"
|
|
17
19
|
echo " To reinstall, run: rm -rf $BACKEND_DIR && npm run setup"
|
|
18
20
|
exit 0
|
|
19
21
|
fi
|
|
20
22
|
|
|
21
|
-
# Detect OS and architecture
|
|
22
23
|
OS=$(uname -s)
|
|
23
24
|
ARCH=$(uname -m)
|
|
25
|
+
IS_WINDOWS=false
|
|
24
26
|
|
|
25
27
|
case "$OS" in
|
|
26
28
|
Darwin)
|
|
@@ -44,9 +46,10 @@ case "$OS" in
|
|
|
44
46
|
MINGW*|MSYS*|CYGWIN*)
|
|
45
47
|
DIST_FILE="sonarlint-backend-cli-${VERSION}-windows_x64.zip"
|
|
46
48
|
PLATFORM="Windows x64"
|
|
49
|
+
IS_WINDOWS=true
|
|
47
50
|
;;
|
|
48
51
|
*)
|
|
49
|
-
echo "
|
|
52
|
+
echo "ERROR: Unsupported OS: $OS"
|
|
50
53
|
echo " Supported platforms: macOS (ARM64/x64), Linux (ARM64/x64), Windows (x64)"
|
|
51
54
|
exit 1
|
|
52
55
|
;;
|
|
@@ -55,60 +58,131 @@ esac
|
|
|
55
58
|
echo "Platform detected: $PLATFORM"
|
|
56
59
|
echo ""
|
|
57
60
|
|
|
58
|
-
# Clean existing installation
|
|
59
61
|
if [ -d "$BACKEND_DIR" ]; then
|
|
60
|
-
echo "
|
|
62
|
+
echo "Cleaning existing installation..."
|
|
61
63
|
rm -rf "$BACKEND_DIR"
|
|
62
64
|
fi
|
|
63
65
|
|
|
64
66
|
mkdir -p "$BACKEND_DIR"
|
|
65
67
|
|
|
66
68
|
echo ""
|
|
67
|
-
echo "
|
|
69
|
+
echo "Step 1/3: Downloading SonarLint Backend..."
|
|
68
70
|
echo " URL: $MAVEN_BASE/$DIST_FILE"
|
|
69
71
|
echo ""
|
|
70
72
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
+
TEMP_DIR=$(mktemp -d)
|
|
74
|
+
EXTRACT_DIR="$TEMP_DIR/extract"
|
|
75
|
+
mkdir -p "$EXTRACT_DIR"
|
|
76
|
+
|
|
77
|
+
cleanup() {
|
|
78
|
+
rm -rf "$TEMP_DIR"
|
|
79
|
+
}
|
|
80
|
+
trap cleanup EXIT
|
|
81
|
+
|
|
82
|
+
curl -L --progress-bar -o "$TEMP_DIR/${DIST_FILE}" "$MAVEN_BASE/$DIST_FILE"
|
|
73
83
|
|
|
74
84
|
echo ""
|
|
75
|
-
echo "
|
|
85
|
+
echo "Extracting backend..."
|
|
76
86
|
|
|
77
|
-
# Extract (auto-detects tar.gz or zip)
|
|
78
87
|
if [[ "$DIST_FILE" == *.zip ]]; then
|
|
79
|
-
|
|
88
|
+
if ! command -v unzip &> /dev/null; then
|
|
89
|
+
echo "ERROR: 'unzip' is required but not installed"
|
|
90
|
+
exit 1
|
|
91
|
+
fi
|
|
92
|
+
unzip -q "$TEMP_DIR/${DIST_FILE}" -d "$EXTRACT_DIR"
|
|
93
|
+
else
|
|
94
|
+
tar -xzf "$TEMP_DIR/${DIST_FILE}" -C "$EXTRACT_DIR"
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
SOURCE_DIR=""
|
|
98
|
+
if [ -d "$EXTRACT_DIR/jre" ] && [ -d "$EXTRACT_DIR/lib" ]; then
|
|
99
|
+
SOURCE_DIR="$EXTRACT_DIR"
|
|
80
100
|
else
|
|
81
|
-
|
|
82
|
-
|
|
101
|
+
SUBDIR_COUNT=$(find "$EXTRACT_DIR" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')
|
|
102
|
+
if [ "$SUBDIR_COUNT" -eq 1 ]; then
|
|
103
|
+
SINGLE_DIR=$(find "$EXTRACT_DIR" -mindepth 1 -maxdepth 1 -type d)
|
|
104
|
+
if [ -d "$SINGLE_DIR/jre" ] && [ -d "$SINGLE_DIR/lib" ]; then
|
|
105
|
+
SOURCE_DIR="$SINGLE_DIR"
|
|
106
|
+
fi
|
|
107
|
+
fi
|
|
108
|
+
fi
|
|
109
|
+
|
|
110
|
+
if [ -z "$SOURCE_DIR" ]; then
|
|
111
|
+
echo "ERROR: Unexpected archive layout. Expected jre/ and lib/ directories."
|
|
112
|
+
echo "Archive contents:"
|
|
113
|
+
ls -la "$EXTRACT_DIR"
|
|
114
|
+
exit 1
|
|
83
115
|
fi
|
|
84
116
|
|
|
85
|
-
|
|
86
|
-
mv /tmp/sonarlint-extract/*/* "$BACKEND_DIR/"
|
|
87
|
-
rm -rf "/tmp/sonarlint-extract"
|
|
88
|
-
rm "/tmp/${DIST_FILE}"
|
|
117
|
+
mv "$SOURCE_DIR"/* "$BACKEND_DIR/"
|
|
89
118
|
|
|
90
119
|
echo ""
|
|
91
|
-
echo "
|
|
120
|
+
echo "Step 2/3: Validating backend installation..."
|
|
121
|
+
|
|
122
|
+
JAR_COUNT=$(find "$BACKEND_DIR/lib" -name "*.jar" 2>/dev/null | wc -l | tr -d ' ')
|
|
123
|
+
if [ "$JAR_COUNT" -lt 10 ]; then
|
|
124
|
+
echo "ERROR: Backend lib/ directory missing or incomplete (found $JAR_COUNT JARs, expected 50+)"
|
|
125
|
+
exit 1
|
|
126
|
+
fi
|
|
127
|
+
echo " lib/: $JAR_COUNT JARs"
|
|
128
|
+
|
|
129
|
+
JAVA_PATH=""
|
|
130
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
131
|
+
if [ -f "$BACKEND_DIR/jre/bin/java.exe" ]; then
|
|
132
|
+
JAVA_PATH="$BACKEND_DIR/jre/bin/java.exe"
|
|
133
|
+
elif [ -f "$BACKEND_DIR/jre/bin/java" ]; then
|
|
134
|
+
JAVA_PATH="$BACKEND_DIR/jre/bin/java"
|
|
135
|
+
fi
|
|
136
|
+
else
|
|
137
|
+
if [ -f "$BACKEND_DIR/jre/bin/java" ]; then
|
|
138
|
+
JAVA_PATH="$BACKEND_DIR/jre/bin/java"
|
|
139
|
+
fi
|
|
140
|
+
fi
|
|
141
|
+
|
|
142
|
+
if [ -z "$JAVA_PATH" ]; then
|
|
143
|
+
echo "ERROR: JRE not found at $BACKEND_DIR/jre/bin/java"
|
|
144
|
+
exit 1
|
|
145
|
+
fi
|
|
146
|
+
echo " jre/: $(basename "$JAVA_PATH") found"
|
|
147
|
+
|
|
148
|
+
echo ""
|
|
149
|
+
echo "Step 3/3: Downloading Language Plugins..."
|
|
92
150
|
echo ""
|
|
93
151
|
|
|
94
152
|
PLUGINS_DIR="$BACKEND_DIR/plugins"
|
|
95
153
|
mkdir -p "$PLUGINS_DIR"
|
|
96
154
|
|
|
97
|
-
|
|
98
|
-
echo "- JavaScript/TypeScript
|
|
99
|
-
curl -L --progress-bar -o "$PLUGINS_DIR
|
|
100
|
-
"https://repo1.maven.org/maven2/org/sonarsource/javascript/sonar-javascript-plugin
|
|
155
|
+
JS_PLUGIN="sonar-javascript-plugin-${JS_PLUGIN_VERSION}.jar"
|
|
156
|
+
echo "- JavaScript/TypeScript ${JS_PLUGIN_VERSION%.*}..."
|
|
157
|
+
curl -L --progress-bar -o "$PLUGINS_DIR/$JS_PLUGIN" \
|
|
158
|
+
"https://repo1.maven.org/maven2/org/sonarsource/javascript/sonar-javascript-plugin/${JS_PLUGIN_VERSION}/$JS_PLUGIN"
|
|
101
159
|
|
|
102
|
-
|
|
103
|
-
echo "- Python
|
|
104
|
-
curl -L --progress-bar -o "$PLUGINS_DIR
|
|
105
|
-
"https://repo1.maven.org/maven2/org/sonarsource/python/sonar-python-plugin
|
|
160
|
+
PYTHON_PLUGIN="sonar-python-plugin-${PYTHON_PLUGIN_VERSION}.jar"
|
|
161
|
+
echo "- Python ${PYTHON_PLUGIN_VERSION%.*}..."
|
|
162
|
+
curl -L --progress-bar -o "$PLUGINS_DIR/$PYTHON_PLUGIN" \
|
|
163
|
+
"https://repo1.maven.org/maven2/org/sonarsource/python/sonar-python-plugin/${PYTHON_PLUGIN_VERSION}/$PYTHON_PLUGIN"
|
|
106
164
|
|
|
107
|
-
# Extract eslint-bridge from JavaScript plugin
|
|
108
165
|
echo ""
|
|
109
|
-
echo "
|
|
166
|
+
echo "Validating plugins..."
|
|
167
|
+
|
|
168
|
+
JS_SIZE=$(stat -f%z "$PLUGINS_DIR/$JS_PLUGIN" 2>/dev/null || stat -c%s "$PLUGINS_DIR/$JS_PLUGIN" 2>/dev/null || echo "0")
|
|
169
|
+
if [ "$JS_SIZE" -lt 1000000 ]; then
|
|
170
|
+
echo "ERROR: JavaScript plugin download failed or incomplete (size: $JS_SIZE bytes)"
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
echo " $JS_PLUGIN: $(( JS_SIZE / 1024 / 1024 ))MB"
|
|
174
|
+
|
|
175
|
+
PYTHON_SIZE=$(stat -f%z "$PLUGINS_DIR/$PYTHON_PLUGIN" 2>/dev/null || stat -c%s "$PLUGINS_DIR/$PYTHON_PLUGIN" 2>/dev/null || echo "0")
|
|
176
|
+
if [ "$PYTHON_SIZE" -lt 1000000 ]; then
|
|
177
|
+
echo "ERROR: Python plugin download failed or incomplete (size: $PYTHON_SIZE bytes)"
|
|
178
|
+
exit 1
|
|
179
|
+
fi
|
|
180
|
+
echo " $PYTHON_PLUGIN: $(( PYTHON_SIZE / 1024 / 1024 ))MB"
|
|
181
|
+
|
|
182
|
+
echo ""
|
|
183
|
+
echo "Extracting eslint-bridge..."
|
|
110
184
|
cd "$PLUGINS_DIR"
|
|
111
|
-
unzip -q
|
|
185
|
+
unzip -q "$JS_PLUGIN" sonarjs-1.0.0.tgz 2>/dev/null || true
|
|
112
186
|
if [ -f sonarjs-1.0.0.tgz ]; then
|
|
113
187
|
mkdir -p eslint-bridge
|
|
114
188
|
tar -xzf sonarjs-1.0.0.tgz -C eslint-bridge
|
|
@@ -116,23 +190,25 @@ if [ -f sonarjs-1.0.0.tgz ]; then
|
|
|
116
190
|
fi
|
|
117
191
|
cd - > /dev/null
|
|
118
192
|
|
|
193
|
+
if [ ! -f "$PLUGINS_DIR/eslint-bridge/package/bin/server.cjs" ]; then
|
|
194
|
+
echo "WARNING: eslint-bridge extraction may have failed"
|
|
195
|
+
echo " Expected: $PLUGINS_DIR/eslint-bridge/package/bin/server.cjs"
|
|
196
|
+
fi
|
|
197
|
+
|
|
119
198
|
echo ""
|
|
120
|
-
echo "
|
|
199
|
+
echo "Setup Complete!"
|
|
121
200
|
echo ""
|
|
122
|
-
echo "
|
|
201
|
+
echo "Installation Summary:"
|
|
123
202
|
echo " Platform: $PLATFORM"
|
|
124
|
-
echo " Backend: $BACKEND_DIR/lib/"
|
|
125
|
-
echo " JRE: $
|
|
203
|
+
echo " Backend: $BACKEND_DIR/lib/ ($JAR_COUNT JARs)"
|
|
204
|
+
echo " JRE: $JAVA_PATH"
|
|
126
205
|
echo " Plugins: $PLUGINS_DIR/"
|
|
127
206
|
echo ""
|
|
128
|
-
echo " Installed components:"
|
|
129
|
-
ls -1 "$BACKEND_DIR" | sed 's/^/ - /'
|
|
130
|
-
echo ""
|
|
131
207
|
echo " Downloaded plugins:"
|
|
132
208
|
ls -1 "$PLUGINS_DIR" | grep ".jar$" | sed 's/^/ - /'
|
|
133
209
|
echo ""
|
|
134
210
|
echo " Total size: $(du -sh "$BACKEND_DIR" | cut -f1)"
|
|
135
211
|
echo ""
|
|
136
|
-
echo "
|
|
212
|
+
echo "Next steps:"
|
|
137
213
|
echo " npm run build"
|
|
138
214
|
echo " npm start"
|