/ 디렉터리 / 플레이그라운드 / SonarQube MCP
● 공식 SonarSource 🔑 본인 키 필요

SonarQube MCP

제작: SonarSource · SonarSource/sonarqube-mcp-server

Sonar 정적 분석 결과가 Claude의 손에 — 대시보드를 훑지 않고 파일과 규칙 단위로 이슈를 수정합니다.

sonarqube-mcp-server는 SonarQube와 SonarCloud의 공식 MCP입니다. 이슈, 보안 핫스팟, 품질 게이트, 메트릭, 코드 품질 히스토리를 MCP 도구로 노출합니다. Claude는 이슈를 읽고, 규칙을 확인하고, 일반적인 추측이 아닌 규칙 권고에 근거한 수정안을 작성합니다.

왜 쓰나요

핵심 기능

라이브 데모

실제 사용 모습

sonarqube-mcp.replay ▶ 준비됨
0/0

설치

클라이언트 선택

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "sonarqube-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--init",
        "--pull=always",
        "-i",
        "--rm",
        "-e",
        "SONARQUBE_TOKEN",
        "-e",
        "SONARQUBE_ORG",
        "mcp/sonarqube"
      ]
    }
  }
}

Claude Desktop → Settings → Developer → Edit Config 열기. 저장 후 앱 재시작.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "sonarqube-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--init",
        "--pull=always",
        "-i",
        "--rm",
        "-e",
        "SONARQUBE_TOKEN",
        "-e",
        "SONARQUBE_ORG",
        "mcp/sonarqube"
      ]
    }
  }
}

Cursor는 Claude Desktop과 동일한 mcpServers 스키마 사용. 프로젝트 설정이 전역보다 우선.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "sonarqube-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--init",
        "--pull=always",
        "-i",
        "--rm",
        "-e",
        "SONARQUBE_TOKEN",
        "-e",
        "SONARQUBE_ORG",
        "mcp/sonarqube"
      ]
    }
  }
}

Cline 사이드바의 MCP Servers 아이콘 클릭 후 "Edit Configuration" 선택.

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "sonarqube-mcp": {
      "command": "docker",
      "args": [
        "run",
        "--init",
        "--pull=always",
        "-i",
        "--rm",
        "-e",
        "SONARQUBE_TOKEN",
        "-e",
        "SONARQUBE_ORG",
        "mcp/sonarqube"
      ]
    }
  }
}

Claude Desktop과 같은 형식. Windsurf 재시작 후 적용.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "sonarqube-mcp",
      "command": "docker",
      "args": [
        "run",
        "--init",
        "--pull=always",
        "-i",
        "--rm",
        "-e",
        "SONARQUBE_TOKEN",
        "-e",
        "SONARQUBE_ORG",
        "mcp/sonarqube"
      ]
    }
  ]
}

Continue는 맵이 아닌 서버 오브젝트 배열 사용.

~/.config/zed/settings.json
{
  "context_servers": {
    "sonarqube-mcp": {
      "command": {
        "path": "docker",
        "args": [
          "run",
          "--init",
          "--pull=always",
          "-i",
          "--rm",
          "-e",
          "SONARQUBE_TOKEN",
          "-e",
          "SONARQUBE_ORG",
          "mcp/sonarqube"
        ]
      }
    }
  }
}

context_servers에 추가. 저장 시 Zed가 핫 리로드.

claude mcp add sonarqube-mcp -- docker run --init --pull=always -i --rm -e SONARQUBE_TOKEN -e SONARQUBE_ORG mcp/sonarqube

한 줄 명령. claude mcp list로 확인, claude mcp remove로 제거.

사용 사례

실전 활용법: SonarQube MCP

코드베이스 전체에서 단일 규칙의 모든 이슈 일괄 수정

👤 기술 부채를 해소하는 개발자 ⏱ ~45 min intermediate

언제 쓸까: Sonar가 동일 규칙의 47개 인스턴스를 플래그했고 한 PR로 모두 수정하고 싶을 때.

사전 조건
  • Sonar token — User → Security → Generate Token (가능하면 프로젝트 범위)
  • Docker 사용 가능 — 표준 docker 설정; 첫 실행 시 이미지가 다운로드됨
흐름
  1. 규칙 식별
    Use sonarqube-mcp. Top 5 rules by open-issue count in project 'foo'.✓ 복사됨
    → 규칙 키 + 수 + 심각도
  2. 모든 인스턴스 조회
    List every open issue for rule java:S2293 (Use Diamond Operator) — file, line, snippet.✓ 복사됨
    → 파일:라인과 주변 코드가 있는 47개 이슈
  3. 수정 적용
    For each, apply the rule's recommended fix. Keep changes minimal; don't reformat.✓ 복사됨
    → 약 20개 파일에 걸친 47개 소규모 편집
  4. 재스캔으로 검증
    After my CI runs the next analysis, recheck the issue count for that rule.✓ 복사됨
    → 수가 0으로 감소

결과: 47개의 산발적인 수정 커밋 대신 전체 규칙을 닫는 집중된 PR 하나.

함정
  • 규칙 자동 수정이 생성된 코드를 깨트림 — 디렉토리별 필터링; 생성/테스트 경로는 건너뛰거나 수동 검토
함께 쓰기: github · filesystem

PR 품질 게이트 실패 원인 디버그

👤 PR이 차단된 개발자 ⏱ ~30 min intermediate

언제 쓸까: Sonar가 PR을 실패시키고 대시보드가 압도적일 때.

흐름
  1. 게이트 상태 조회
    Use sonarqube-mcp. Show quality gate status for PR 1234 — which conditions failed?✓ 복사됨
    → 게이트 분석: 예) 'New Coverage 67% < 80% 임계값'
  2. 실패 조건 상세 분석
    For 'New Coverage' below threshold — list new lines added in this PR with no test coverage.✓ 복사됨
    → 파일별 커버리지 없는 새 라인 목록
  3. 테스트 생성
    Write tests covering those uncovered lines.✓ 복사됨
    → 새 테스트 파일 추가됨; 케이스 설명

결과: 커버리지 폭탄이 아닌 타겟화된 테스트로 PR 차단 해제.

함정
  • 커버리지를 위한 테스트, 동작을 위한 테스트 아님 — Claude에게 각 테스트의 assertion 내용을 명시하도록 요청; 실제 assertion이 없는 것은 거부
함께 쓰기: github

보안 핫스팟 검토 및 해결

👤 보안에 민감한 엔지니어 ⏱ ~40 min advanced

언제 쓸까: 핫스팟이 쌓여서 '안전 검토됨' 또는 '수정됨'으로 분류해야 할 때.

흐름
  1. 미해결 핫스팟 목록
    Use sonarqube-mcp. List all unreviewed security hotspots in project 'foo' grouped by category.✓ 복사됨
    → 카테고리별 그룹화된 핫스팟 (예: 'Weak Cryptography', 'Auth')
  2. 위험 설명
    For each, summarize the risk in 1 line. Mark which are clearly safe-to-acknowledge vs need-fix.✓ 복사됨
    → 주석이 달린 분류 목록
  3. 수정 또는 확인
    For need-fix ones, apply the rule's safe pattern. For safe ones, give me the comment to leave on the hotspot review.✓ 복사됨
    → 수정 적용 + 검토 댓글 초안

결과: 조용히 무시되는 것이 아닌 감사 추적이 있는 핫스팟 처리.

함정
  • 생각 없이 '안전'으로 표시 — Claude에게 댓글에 왜 안전한지 이유를 명시하도록 요구 — 감사 가능한 추적 생성
함께 쓰기: github

조합

다른 MCP와 조합해 10배 효율

sonarqube-mcp + github

Sonar 결과로 PR에 주석 달기 또는 새 위반에 대한 이슈 자동 생성

On every PR, comment Sonar's gate result and any new issues it added.✓ 복사됨
sonarqube-mcp + filesystem

규칙 수정을 로컬에 적용하고 커밋

Fix all java:S2293 instances; write the diffs locally for review before commit.✓ 복사됨

도구

이 MCP가 노출하는 것

도구입력언제 호출비용
search_issues project, rules?, severities?, types?, branch? 규칙/심각도/유형으로 이슈 필터링 1 SonarQube API call
get_rule rule_key 수정 전 공식 가이드라인 읽기 1 API call
get_quality_gate project, branch_or_pr PR/브랜치 게이트 실패 진단 1 API call
search_hotspots project, status? 보안 검토 1 API call
get_metrics project, metric_keys[] 추세/드리프트 확인 (커버리지, 중복) 1 API call

비용 및 제한

운영 비용

API 쿼터
Sonar API 속도 제한은 에디션에 따라 다름 — 대량 루프에서 보수적으로 사용
호출당 토큰
이슈는 100개 페이지 단위; 각 이슈는 약 200 token
금액
SonarCloud 공개 프로젝트는 무료; SonarQube는 Enterprise 라이선스 필요
search_issues에서 적극적으로 필터링 — 모든 것을 페이징하는 것은 비효율적

보안

권한, 시크릿, 파급범위

최소 스코프: Browse See Source Code
자격 증명 저장: SONARQUBE_TOKEN 환경 변수, 프로젝트 범위
데이터 외부 송신: Sonar 인스턴스로 (sonarcloud.io 또는 자체 호스팅)
절대 부여 금지: 채팅 기반 에이전트에 관리자 권한 금지

문제 해결

자주 발생하는 오류와 해결

401 Unauthorized

token 재생성; 프로젝트 범위가 필요할 때 사용자 범위 token인지 확인

확인: curl -u $SONARQUBE_TOKEN: $SONAR_HOST/api/projects/search
잘못된 organization

SONARQUBE_ORG 환경 변수가 Sonar org 슬러그와 정확히 일치해야 함 (소문자)

Docker 컨테이너가 자체 호스팅 SonarQube에 접근 불가

--network host 사용 또는 SonarQube를 접근 가능한 호스트명으로 노출; 컨테이너 내부에서 SONAR_HOST_URL 설정

확인: docker run ... curl $SONAR_HOST_URL/api/system/status
이슈 목록이 오래된 것 같음

Sonar는 마지막 완료된 분석을 반영 — 분석을 다시 실행하거나 프로젝트의 마지막 분석 타임스탬프 확인

대안

SonarQube MCP 다른 것과 비교

대안언제 쓰나단점/장점
CodeQL via GitHub MCP이미 GitHub Advanced Security를 사용 중이고 같은 인터페이스에서 결과를 원할 때규칙 세트가 다름; 품질 게이트 개념 없음
Semgrep MCPSonar 인프라 없이 경량 패턴 기반 스캐닝을 원할 때코드 스멜/유지보수성 메트릭 커버리지 낮음

더 보기

리소스

📖 GitHub에서 공식 README 읽기

🐙 열린 이슈 보기

🔍 400+ MCP 서버 및 Skills 전체 보기