MCP Live ยท SonarQube Server

SonarQube MCP
untuk Tim Titik Terang

Sambungkan Claude Code kamu langsung ke SonarQube milik tim. Analisis kualitas kode, cari bug & code smell, dan perbaiki issue tanpa keluar dari editor โ€” tanpa install apa pun selain satu perintah connect.

๐Ÿค–
Males baca? Kasih ke Claude Code aja. Seluruh panduan ini tersedia versi plain-text untuk agent: sonarcube.titikterang.id/llms.txt โ€” tinggal bilang: "baca https://sonarcube.titikterang.id/llms.txt lalu sambungkan aku ke SonarQube tim".

00 Apa ini & kenapa gampang

Satu server MCP sudah jalan di VPS tim. Kamu cukup nyambung ke URL-nya.

SonarQube menganalisis kode di server. SonarQube MCP adalah jembatan yang membuat Claude Code bisa "ngobrol" dengan hasil analisis itu. Karena server MCP-nya sudah kami host di VPS (mode HTTP), kamu tidak perlu Docker, Java, atau apa pun di laptop โ€” cukup Claude Code + satu perintah.

โ†’
Arsitektur: Claude Code (laptopmu) โ†’ HTTPS โ†’ MCP @ VPS โ†’ SonarQube @ VPS. Token kamu dikirim per-request (stateless), jadi tiap orang pakai token sendiri.

01 Prasyarat

Cuma dua.

Claude Code terpasang

Cek dengan:

claude --version
Token SonarQube kamu

Login ke SonarQube โ†’ klik avatar โ†’ My Account โ†’ Security โ†’ Generate Tokens โ†’ type User Token. Simpan token squ_... baik-baik.

Awas ketukar: token sqp_/sqa_ dari wizard CI cuma bisa submit scan โ€” buat MCP/Claude Code wajib User Token squ_..., kalau tidak agent-mu bakal "tidak punya izin".

Buka SonarQube โ†—

02 Sambungkan (1 perintah)

Ganti TOKEN_KAMU dengan token SonarQube kamu, lalu jalankan di terminal.

claude mcp add --transport http sonarqube \ https://sonarcube.titikterang.id/mcp \ --header "Authorization: Bearer TOKEN_KAMU"
i
Mau MCP-nya aktif di semua project? Tambahkan --scope user. Kalau cuma untuk repo e-office, jalankan dari dalam folder repo (default scope local).

Verifikasi berhasil:

claude mcp list # sonarqube: https://sonarcube.titikterang.id/mcp (HTTP) - โœ“ Connected

03 Perintah ke Claude yang efektif

Buka Claude Code di repo, lalu tinggal ketik salah satu ini (Bahasa Indonesia pun paham).

Cek kesehatan project

"Cek quality gate project e-office-bwi di SonarQube, ringkas status & metrik utamanya."

Beresin issue

"Ambil 10 issue paling parah dari SonarQube untuk e-office-bwi, jelaskan, lalu perbaiki yang aman satu per satu."

Fokus keamanan

"Tampilkan semua security hotspot & vulnerability dari SonarQube, urutkan dari paling kritis, dan usulkan perbaikannya."

Sebelum merge

"Aku mau merge branch ini. Cek issue baru di SonarQube untuk branch/PR ini dan pastikan quality gate lolos."

Bersih-bersih

"Cari duplikasi kode & code smell terbanyak dari SonarQube, mulai dari file dengan skor terburuk."

Analisis snippet

"Analisis potongan kode ini pakai aturan SonarQube sebelum aku commit." (tempel kodenya)

04 Kombinasikan dengan skills / subagent Claude

SonarQube kasih temuan; subagent Claude yang mengeksekusi perbaikannya. Pasangan yang bagus:

code-reviewerSetelah SonarQube nunjuk issue, minta review menyeluruh + rekomendasi perbaikan berkualitas.
security-reviewerPasangkan dengan security hotspot SonarQube untuk audit OWASP mendalam.
refactor-cleanerUntuk code smell & duplikasi โ€” bersihkan dead code dengan aman.
build-error-resolverKalau perbaikan bikin build error, agent ini yang membereskan.
โ˜…
Contoh alur sakti: "Ambil issue SonarQube untuk e-office-bwi, lalu pakai subagent code-reviewer untuk memvalidasi tiap perbaikan sebelum ditulis."

05 Tambah project baru (mis. repo private GitLab)

Sekali setup per repo, habis itu analisa jalan otomatis tiap push / merge request.

  1. Buat project di SonarQube. Login โ†’ Create Project โ†’ Local/Manually โ†’ isi Project Key (mis. nama-repo) & Display Name. Ingat key-nya.
  2. Generate token analisa. Saat wizard project, pilih GitLab CI โ†’ SonarQube kasih token analisa squ_.... Copy.
  3. Simpan variabel di GitLab. Repo โ†’ Settings โ†’ CI/CD โ†’ Variables (centang Masked + Protected):
    SONAR_HOST_URL = http://203.55.176.248:9000 SONAR_TOKEN = squ_xxxxxxxxxxxx
  4. Tambah sonar-project.properties di root repo:
    sonar.projectKey=nama-repo sonar.projectName=Nama Repo sonar.sources=. sonar.sourceEncoding=UTF-8 sonar.exclusions=vendor/**,node_modules/**,public/build/**,storage/**
  5. Tambah job di .gitlab-ci.yml (sama seperti yang sudah dipakai repo e-office-bwi):
    sonarqube-check: stage: quality image: name: sonarsource/sonar-scanner-cli:latest entrypoint: [""] variables: SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # cache scanner GIT_DEPTH: "0" # blame butuh full history cache: key: "${CI_JOB_NAME}" paths: - .sonar/cache script: - sonar-scanner -Dsonar.host.url="${SONAR_HOST_URL}" -Dsonar.token="${SONAR_TOKEN}" rules: - if: $CI_COMMIT_BRANCH == "dev" - if: $CI_COMMIT_BRANCH == "main" - if: $CI_PIPELINE_SOURCE == "merge_request_event"
โ†’
Selesai. Tiap push ke main/dev atau buka merge request, GitLab Runner otomatis scan & kirim hasil ke SonarQube. Repo private aman โ€” yang menjalankan scanner adalah Runner GitLab yang sudah pegang kodenya, SonarQube tak perlu akses ke GitLab.
!
Batasan versi gratis (Community Build): hanya menganalisa satu branch utama (main/dev). Analisa terpisah per-branch & komentar otomatis di merge request adalah fitur Developer Edition (berbayar). Di versi gratis, hasil MR tetap masuk tapi menumpuk ke branch utama.

06 Scan lokal dari laptop (tanpa CI)

Belum punya akses maintainer GitLab, atau mau kirim hasil scan cepat sebelum push? Jalankan scanner langsung dari root repo.

npx -y @sonar/scan \ -Dsonar.host.url=http://203.55.176.248:9000 \ -Dsonar.token=TOKEN_KAMU
i
Butuh Node.js + file sonar-project.properties di root repo (lihat langkah 05). Pakai token pribadimu โ€” jangan tulis token di file mana pun; folder .scannerwork/ yang muncul setelah scan masuk .gitignore.
!
Error checksum saat download jar scanner? Bersihkan cache lalu ulangi: rm -rf ~/.sonar/cache. Warning "Missing blame information" artinya ada file yang belum di-commit โ€” commit dulu, scan lagi.

07 Coverage (syarat quality gate)

Quality gate tim mensyaratkan coverage kode baru โ‰ฅ 80%. Laporan coverage harus digenerate sebelum scan โ€” kalau tidak, Sonar menganggap coverage 0%.

1. Generate laporan (contoh stack Laravel + React seperti e-office-bwi):

# PHP โ€” butuh driver coverage (pcov / xdebug) vendor/bin/phpunit --coverage-clover coverage/clover.xml # JS/TS โ€” vitest dengan reporter lcov npx vitest run --coverage

2. Daftarkan path laporan di sonar-project.properties:

sonar.php.coverage.reportPaths=coverage/clover.xml sonar.javascript.lcov.reportPaths=coverage/js/lcov.info

3. Scan seperti biasa (langkah 05 atau 06). Angka coverage muncul di dashboard project.

โ†’
Folder coverage/ masuk .gitignore โ€” generate segar tiap mau scan. Kalau lewat GitLab CI, tambahkan stage test yang menghasilkan laporan ini sebelum job sonarqube-check. File konfigurasi statis bisa dikecualikan via sonar.coverage.exclusions (mis. config/**).

08 Kalau macet

401 / UnauthorizedToken salah/expired. Generate ulang di SonarQube โ†’ My Account โ†’ Security.
"Insufficient privileges"Token yang dipakai jenis analysis (sqp_/sqa_), bukan User Token squ_. Generate User Token lalu pasang ulang MCP.
Gate "new code" kosongNormal di scan pertama โ€” baseline Previous version butuh pembanding. Mulai scan kedua metriknya aktif.
Not connectedCek claude mcp list. Hapus & pasang ulang: claude mcp remove sonarqube lalu ulangi langkah 02.
Project tak ketemuPastikan key persis e-office-bwi. File sonar-project.properties di repo sudah menuliskannya.
Coverage 0%Laporan coverage belum digenerate sebelum scan, atau path di sonar-project.properties tidak cocok โ€” lihat langkah 07.
Fallback URLKalau domain bermasalah, pakai langsung: http://203.55.176.248:8080/mcp