VOOZH about

URL: https://glama.ai/mcp/servers/mshegolev/sonarqube-mcp?locale=ko-KR

โ‡ฑ sonarqube-mcp by mshegolev | Glama


sonarqube-mcp

๐Ÿ‘ PyPI
๐Ÿ‘ Python
๐Ÿ‘ License: MIT

SonarQube์šฉ MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. LLM ์—์ด์ „ํŠธ(Claude Code, Cursor, OpenCode ๋“ฑ)๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ฃผ์š” ์ง€ํ‘œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ , ์‹ฌ๊ฐ๋„/์œ ํ˜• ํ•„ํ„ฐ๋กœ ์ด์Šˆ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ, ์ง€ํ‘œ๊ฐ€ ๊ฐ€์žฅ ๋‚˜์œ ํ”„๋กœ์ ํŠธ ์ˆœ์œ„๋ฅผ ๋งค๊ธธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Python, FastMCP, stdio ์ „์†ก์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  SonarQube 9.x / 10.x ์ธ์Šคํ„ด์Šค(์ž์ฒด ํ˜ธ์ŠคํŒ…) ๋ฐ SonarCloud์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์™œ ๋˜ ๋‹ค๋ฅธ SonarQube MCP์ธ๊ฐ€์š”?

๊ธฐ์กด์—๋„ ๋ช‡ ๊ฐ€์ง€ SonarQube MCP๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ๋‹จ์ผ ํ”„๋กœ์ ํŠธ ์ฝ๊ธฐ ์ˆ˜์ค€์—์„œ ๋ฉˆ์ถฐ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋Š” ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ˆœ์œ„ ๋งค๊ธฐ๊ธฐ(sonarqube_worst_metrics) ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠธ๋ฆฌ์•„์ง€ ์„ธ์…˜ ์ค‘์— ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ธ "์กฐ์ง ๋‚ด์—์„œ ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ƒ์œ„ 10๊ฐœ ์„œ๋น„์Šค ๋ณด์—ฌ์ค˜"์™€ ๊ฐ™์€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„๊ตฌ๋Š” ์ฝ๊ธฐ ์ „์šฉ์ด๋ฉฐ ์•ˆ์ „ํ•˜๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(Pydantic ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ, ์‹ฌ๊ฐ๋„/์œ ํ˜• ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ).

Related MCP server: sonarqube-api-mcp

์„ค๊ณ„ ํŠน์ง•

  • ๋„๊ตฌ ์ฃผ์„ โ€” 5๊ฐ€์ง€ ๋„๊ตฌ ๋ชจ๋‘ readOnlyHint: True, destructiveHint: False, idempotentHint: True๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด SonarQube์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ โ€” ๋ชจ๋“  ๋„๊ตฌ๋Š” ํƒ€์ž…์ด ์ง€์ •๋œ ํŽ˜์ด๋กœ๋“œ(TypedDict)์™€ ๋งˆํฌ๋‹ค์šด ์š”์•ฝ์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ, ๊ตฌ์กฐํ™”๋œ ์ฝ˜ํ…์ธ  ์ง€์› ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‘๋‹ต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐํ™”๋œ ์˜ค๋ฅ˜ โ€” 401 / 403 / 404 / 400 / 429 / 5xx ์˜ค๋ฅ˜๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํžŒํŠธ(์˜ˆ: "ํ† ํฐ ์žฌ์ƒ์„ฑ", "sonarqube_list_projects๋กœ ํ”„๋กœ์ ํŠธ ํ‚ค ํ™•์ธ")์™€ ํ•จ๊ป˜ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.

  • Pydantic ์ž…๋ ฅ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ โ€” ๋ชจ๋“  ์ธ์ˆ˜์— ๋Œ€ํ•ด ์ ์šฉ๋˜๋ฉฐ, ์š”์ฒญ์ด ์ „์†ก๋˜๊ธฐ ์ „์— ์‹ฌ๊ฐ๋„/์œ ํ˜• ํ•„ํ„ฐ๊ฐ€ ์œ ํšจํ•œ SonarQube ์—ด๊ฑฐํ˜•๊ณผ ๋Œ€์กฐ๋˜์–ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ตœ์•… ์ง€ํ‘œ ์ˆœ์œ„ ๋งค๊ธฐ๊ธฐ โ€” ๋‚ด๋ถ€์ ์œผ๋กœ /api/measures/search ํ˜ธ์ถœ์„ ์ผ๊ด„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์„ ํƒํ•œ ์ง€ํ‘œ์— ๋”ฐ๋ผ ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๋‚˜์œ์ง€ ๋‚ฎ์„์ˆ˜๋ก ๋‚˜์œ์ง€์— ๋งž์ถฐ ์˜ค๋ฆ„์ฐจ์ˆœ ๋˜๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ (5๊ฐ€์ง€ ๋„๊ตฌ)

๊ฒ€์ƒ‰

  • sonarqube_list_projects โ€” ์„ ํƒ์  ํ…์ŠคํŠธ ํ•„ํ„ฐ๋ฅผ ํฌํ•จํ•œ ํŽ˜์ด์ง€๋„ค์ด์…˜ ํ”„๋กœ์ ํŠธ ๊ฒ€์ƒ‰

๋‹จ์ผ ํ”„๋กœ์ ํŠธ ํ†ต์ฐฐ

  • sonarqube_project_metrics โ€” ๋‹จ์ผ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ธก์ •๊ฐ’(๊ธฐ๋ณธ ์„ธํŠธ: ๋ฒ„๊ทธ / ์ปค๋ฒ„๋ฆฌ์ง€ / ์ฝ”๋“œ ์Šค๋ฉœ / ๋“ฑ๊ธ‰ / ncloc / ํ…Œ์ŠคํŠธ / alert_status)

  • sonarqube_quality_gate_status โ€” ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ์ƒํƒœ + ์กฐ๊ฑด๋ณ„ ์‹คํŒจ ๋‚ด์—ญ

์ด์Šˆ ํŠธ๋ฆฌ์•„์ง€

  • sonarqube_get_issues โ€” ์‹ฌ๊ฐ๋„ / ์œ ํ˜• / ํ•ด๊ฒฐ ์ƒํƒœ๋ณ„๋กœ ํ•„ํ„ฐ๋ง๋œ ์ด์Šˆ ๊ฒ€์ƒ‰

ํ”„๋กœ์ ํŠธ ๊ฐ„ ์ˆœ์œ„ ๋งค๊ธฐ๊ธฐ

  • sonarqube_worst_metrics โ€” ์ง€ํ‘œ์˜ ์ตœ์•… ๊ฐ’(์˜ˆ: ์ตœ์•…์˜ ์ปค๋ฒ„๋ฆฌ์ง€, ๊ฐ€์žฅ ๋งŽ์€ ๋ฒ„๊ทธ)์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์œ„ N๊ฐœ ํ”„๋กœ์ ํŠธ ์ •๋ ฌ

์„ค์น˜

Python 3.10+๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

# via uvx (recommended โ€” no install, just run)
uvx --from sonarqube-mcp sonarqube-mcp

# or via pipx
pipx install sonarqube-mcp

๊ตฌ์„ฑ

claude mcp add sonarqube -s project \
 --env SONARQUBE_URL=https://sonar.example.com \
 --env SONARQUBE_TOKEN=squ_your_token \
 --env SONARQUBE_SSL_VERIFY=true \
 -- uvx --from sonarqube-mcp sonarqube-mcp

๋˜๋Š” .mcp.json ํŒŒ์ผ:

{
 "mcpServers": {
 "sonarqube": {
 "type": "stdio",
 "command": "uvx",
 "args": ["--from", "sonarqube-mcp", "sonarqube-mcp"],
 "env": {
 "SONARQUBE_URL": "https://sonar.example.com",
 "SONARQUBE_TOKEN": "${SONARQUBE_TOKEN}",
 "SONARQUBE_SSL_VERIFY": "true"
 }
 }
 }
}

ํ™•์ธ:

claude mcp list
# sonarqube: uvx --from sonarqube-mcp sonarqube-mcp - โœ“ Connected

ํ™˜๊ฒฝ ๋ณ€์ˆ˜

๋ณ€์ˆ˜

ํ•„์ˆ˜

์„ค๋ช…

SONARQUBE_URL

์˜ˆ

SonarQube URL (๋์— ์Šฌ๋ž˜์‹œ ์ œ์™ธ)

SONARQUBE_TOKEN

์˜ˆ

Bearer ํ† ํฐ. ์ƒ์„ฑ ์œ„์น˜: ๋‚ด ๊ณ„์ • โ†’ ๋ณด์•ˆ โ†’ ํ† ํฐ

SONARQUBE_SSL_VERIFY

์•„๋‹ˆ์˜ค

true/false. ๊ธฐ๋ณธ๊ฐ’: true.

HTTP ํ”„๋ก์‹œ ๊ด€๋ จ ์ฐธ๊ณ ์‚ฌํ•ญ. ์ž์ฒด ํ˜ธ์ŠคํŒ…๋œ SonarQube๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํด๋ผ์ด์–ธํŠธ๋Š” ์˜๋„์ ์œผ๋กœ ํ™˜๊ฒฝ ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ ๊ฒ€์ƒ‰(trust_env=False)์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. SonarCloud๋‚˜ ๊ธฐ์—… ํ”„๋ก์‹œ ๋’ค์— ์žˆ๋Š” SonarQube์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ, ํ˜„์žฌ๋Š” ํ”„๋กœ์„ธ์Šค ์ˆ˜์ค€์—์„œ ํ”„๋ก์‹œ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ SONARQUBE_TRUST_ENV_PROXY ์˜ต์…˜์ด ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ

  • "'einvy'์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  SonarQube ํ”„๋กœ์ ํŠธ ๋‚˜์—ด"

  • "einvy:aut_einvy์˜ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ ์ƒํƒœ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?"

  • "๋ฒ„๊ทธ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ƒ์œ„ 10๊ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์—ฌ์ค˜"

  • "einvy:aut_einvy์—์„œ ๋ชจ๋“  BLOCKER / CRITICAL ์ทจ์•ฝ์  ์ฐพ๊ธฐ"

  • "einvy:qa_assistant์˜ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์–ผ๋งˆ์ธ๊ฐ€์š”?"

  • "'einvy' ์ฟผ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋Š” ์ปค๋ฒ„๋ฆฌ์ง€๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ์ƒ์œ„ 5๊ฐœ ํ”„๋กœ์ ํŠธ"

์ง€ํ‘œ ๋ฐฉํ–ฅ (sonarqube_worst_metrics์—์„œ ์‚ฌ์šฉ)

๋†’์„์ˆ˜๋ก ๋‚˜์จ (๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ โ€” ๋งŽ์„์ˆ˜๋ก ๋‚˜์จ): bugs, code_smells, vulnerabilities, duplicated_lines_density, reliability_rating, security_rating, security_review_rating, sqale_rating, open_issues

๋‚ฎ์„์ˆ˜๋ก ๋‚˜์จ (์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ โ€” ์ ์„์ˆ˜๋ก ๋‚˜์จ): coverage, line_coverage, branch_coverage, test_success_density, tests

SonarQube์˜ ๋“ฑ๊ธ‰์€ ์ˆซ์ž ๋ฌธ์ž์—ด๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, "1"(A, ์ตœ๊ณ )๋ถ€ํ„ฐ "5"(E, ์ตœ์•…)๊นŒ์ง€์ž…๋‹ˆ๋‹ค.

์•ˆ์ „์„ฑ

  • ๋ชจ๋“  ๋„๊ตฌ๋Š” readOnlyHint: True๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด SonarQube ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • POST / PUT / DELETE ์š”์ฒญ์€ ์ ˆ๋Œ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์‹ฌ๊ฐ๋„ / ์œ ํ˜• / ํ•œ์ •์ž ์ž…๋ ฅ์€ API ํ˜ธ์ถœ ์ „์— SonarQube ์—ด๊ฑฐํ˜•๊ณผ ๋Œ€์กฐํ•˜์—ฌ ๊ฒ€์ฆ๋˜๋ฏ€๋กœ, ์˜คํƒ€๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ API๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ๋„๊ตฌ๊ฐ€ ์ฆ‰์‹œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ํŠน์„ฑ

  • sonarqube_worst_metrics๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋„๊ตฌ๋Š” SonarQube์— ํ•˜๋‚˜์˜ HTTP ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. sonarqube_worst_metrics๋Š” ํ•˜๋‚˜์˜ ๊ฒ€์ƒ‰ ํ˜ธ์ถœ + โŒˆํ›„๋ณด๊ตฐ/100โŒ‰๋ฒˆ์˜ ๋Œ€๋Ÿ‰ ์ธก์ •๊ฐ’ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์„ค์ • ์‹œ ํ˜ธ์ถœ ํšŸ์ˆ˜๋Š” 2ํšŒ ์ดํ•˜์ž…๋‹ˆ๋‹ค.

  • ์ •์ƒ์ ์ธ SonarQube ์ธ์Šคํ„ด์Šค์—์„œ์˜ ๋‹จ์ผ ๋„๊ตฌ ์‘๋‹ต ์‹œ๊ฐ„: ์ผ๋ฐ˜์ ์œผ๋กœ 500ms ๋ฏธ๋งŒ.

  • ํŽ˜์ด์ง€๋„ค์ด์…˜์€ SonarQube๋กœ ์ „๋‹ฌ(p + ps ๋งค๊ฐœ๋ณ€์ˆ˜)๋˜๋ฏ€๋กœ MCP ์„œ๋ฒ„์—์„œ ์ „์ฒด ๊ฒฐ๊ณผ๋ฅผ ๋ฒ„ํผ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • sonarqube_worst_metrics๋Š” candidate_pool์„ 500์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์ฒœ ๊ฐœ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ์ธ์Šคํ„ด์Šค์—์„œ๋Š” ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ธฐ ์ „์— query=๋กœ ๋ฏธ๋ฆฌ ํ•„ํ„ฐ๋งํ•˜์‹ญ์‹œ์˜ค(๋„๊ตฌ ๋…์ŠคํŠธ๋ง ์ฐธ์กฐ).

  • SonarQube์—๋Š” ๊ณต๊ฐœ๋œ ์—„๊ฒฉํ•œ ์†๋„ ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. 429 ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์‹ ๋˜๋ฉด ์„œ๋ฒ„๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€("์žฌ์‹œ๋„ ์ „ 30-60์ดˆ ๋Œ€๊ธฐ; page_size ์ถ•์†Œ")๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

git clone https://github.com/mshegolev/sonarqube-mcp.git
cd sonarqube-mcp
pip install -e '.[dev]'
pytest

๋ผ์ด์„ ์Šค

MIT ยฉ Mikhail Shchegolev

A
license - permissive license
A
quality
A
maintenance

Maintenance

โ€“Maintainers
โ€“Response time
โ€“Release cycle
1Releases (12mo)
Commit activity

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mshegolev/sonarqube-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server