/ 目录 / 演练场 / SonarQube MCP
● 官方 SonarSource 🔑 需要你的密钥

SonarQube MCP

作者 SonarSource · SonarSource/sonarqube-mcp-server

将 Sonar 静态分析结果交到 Claude 手中——按文件和规则修复问题,而非在仪表盘中浏览。

sonarqube-mcp-server 是 SonarQube 和 SonarCloud 的官方 MCP。它以 MCP 工具的形式暴露 issue、安全热点、质量门、指标和代码质量历史。Claude 读取 issue,查阅规则,并根据规则的建议编写修复——而非泛泛猜测。

为什么要用

核心特性

实时演示

实际使用效果

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

批量修复整个代码库中某条规则的所有 issue

👤 偿还技术债的开发者 ⏱ ~45 min intermediate

何时使用: Sonar 标记了同一条规则的 47 个实例,你想在一个 PR 中全部修复。

前置条件
  • Sonar token — 用户 → 安全 → 生成 Token(尽量使用项目范围的 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 个 issue,含文件名、行号和周边代码
  3. 应用修复
    For each, apply the rule's recommended fix. Keep changes minimal; don't reformat.✓ 已复制
    → 47 处小改动,分散在约 20 个文件中
  4. 重新扫描验证
    After my CI runs the next analysis, recheck the issue count for that rule.✓ 已复制
    → 数量降为 0

结果: 一个专注的 PR 关闭整条规则,而非 47 个零散的修复提交。

注意事项
  • 规则自动修复破坏了生成代码 — 按目录过滤;跳过 generated/test 路径,或对这些路径进行人工审查
搭配使用: github · filesystem

调试 PR 质量门为何失败

👤 PR 被阻塞的开发者 ⏱ ~30 min intermediate

何时使用: Sonar 拦截了你的 PR,但仪表盘信息让你无从下手。

步骤
  1. 获取质量门状态
    Use sonarqube-mcp. Show quality gate status for PR 1234 — which conditions failed?✓ 已复制
    → 质量门细项:例如「新增覆盖率 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 说明每个测试的断言内容;拒绝没有实质断言的测试
搭配使用: github

审查并处理安全热点

👤 注重安全的工程师 ⏱ ~40 min advanced

何时使用: 安全热点积压,需要逐一分类为「已审查安全」或「需修复」。

步骤
  1. 列出未处理热点
    Use sonarqube-mcp. List all unreviewed security hotspots in project 'foo' grouped by category.✓ 已复制
    → 按类别分组的热点(如「弱加密」、「认证」)
  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 搭配,撬动十倍杠杆

sonarqube-mcp + github

在 PR 上注释 Sonar 发现,或自动为新违规创建 issue

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? 按规则/严重等级/类型过滤 issue 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 限速因版本而异——批量循环请保守处理
每次调用 Token 数
Issue 每页 100 条;每条约 200 token
费用
SonarCloud 公开项目免费;SonarQube 需要企业许可证
提示
在 search_issues 处尽量严格过滤——逐页翻查全部结果非常浪费

安全

权限、密钥、影响范围

最小权限: Browse See Source Code
凭据存储: SONARQUBE_TOKEN 环境变量,项目范围
数据出站: 发往你的 Sonar 实例(sonarcloud.io 或自托管)
切勿授予: 不要给聊天驱动的 agent 授予管理权限

故障排查

常见错误与修复

401 未授权

重新生成 token;检查 token 是否仅为用户范围,而项目需要项目范围

验证: curl -u $SONARQUBE_TOKEN: $SONAR_HOST/api/projects/search
组织错误

SONARQUBE_ORG 环境变量必须与你的 Sonar 组织 slug 完全匹配(小写)

Docker 容器无法访问自托管 SonarQube

传入 --network host 或在可访问的主机名上暴露 SonarQube;在容器内设置 SONAR_HOST_URL

验证: docker run ... curl $SONAR_HOST_URL/api/system/status
Issue 列表似乎过期

Sonar 反映的是最近一次已完成分析的结果——重新运行分析,或检查项目的最近分析时间戳

替代方案

SonarQube MCP 对比其他方案

替代方案何时用它替代权衡
CodeQL via GitHub MCP你已在使用 GitHub Advanced Security,并希望在同一界面查看结果规则集不同;没有质量门概念
Semgrep MCP你想要无需 Sonar 基础设施的轻量模式匹配扫描对代码异味/可维护性指标的覆盖较少

更多

资源

📖 阅读 GitHub 上的官方 README

🐙 查看未解决的 issue

🔍 浏览全部 400+ MCP 服务器和 Skills