3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SonarQube × MCP完全ガイド:静的解析結果を「AIコーディング」でリアルタイムに修正する方法

3
Last updated at Posted at 2025-12-13

AIのおかげでコーディング速度は劇的に上がりました。しかし、その後の 「品質チェックと手動修正」 が新たなボトルネックになっていませんか?

「AIにコードを書かせる」→「静的解析で大量の警告が出る」→「結局、人間が手作業で直す」。
これでは、AIが生んだ技術的負債を人間が返済しているようなものです。

「AIが出した問題は、AI自身に直させる」

本記事では、SonarQubeとMCPを組み合わせ、解析結果の確認からコード修正までをAIに完結させ、エンジニアを単純作業から解放する方法を解説します。

SonarQube MCP serverとは

これまでの「AIコーディング」と「静的解析」の連携は、基本的にコピー&ペーストでした。
SonarQubeの画面にあるエラーメッセージをコピーし、AIチャットに貼り付け、「これを直して」と頼むしかないです。

MCP (Model Context Protocol) を使うと、AIクライアントが以下のことを自動的に行えるようになります。

  1. 直接アクセス: SonarQubeのAPIを叩き、現在のプロジェクトのバグやCode Smellを取得する
  2. 文脈理解: 指摘された箇所のソースコードをローカルファイルから読み取る
  3. 自動修正: 指摘内容に基づいて修正案を作成し、ファイルに書き込む

つまり、「SonarQubeの指摘を全部直しておいて」の一言で完結する世界です。

アーキテクチャ構成

本システムの全体像は以下の通りです。
AI Agent(Gemini)が「司令塔」となり、コードの生成から静的解析の実行、そして修正までを自律的に行います。

image.png

各コンポーネントの役割

  • AI Agent (Gemini): 開発者の指示を受け、コード生成、ツール実行(スキャナ)、MCP経由の情報取得、そしてコード修正を行う中心的な存在です
  • Source Code (Local): AIによって生成・修正される対象のファイル群です
  • SonarQube MCP Server: AIとSonarQubeをつなぐ「翻訳機」です
  • SonarQube Server: 解析結果(Issue)を管理するデータベースです

処理フロー

このアーキテクチャでは、以下の4ステップのサイクルをAIが回すことで、高品質なコードを素早く生み出します。

  1. コード生成:
    まず、AI Agentが開発者の指示(プロンプト)に基づいて初期コードを生成し、ローカルのSource Codeに書き込みます
  2. 静的解析の実行 (SAST Scan):
    次に、AI AgentがローカルでSonarScannerツールを起動します。解析結果は自動的にSonarQube Serverに送信・格納されます(図中の点線矢印)
  3. Issueの取得 (via MCP):
    解析完了後、AI AgentはMCP Serverを経由してSonarQube Serverに問い合わせ、直前に検出された「修正すべきIssue」のリストを取得します
  4. 理解と自動改善:
    AI Agentは、指摘された箇所のソースコードを読み込んで文脈を深く理解し、適切な修正案を作成して、直接ファイルを書き換えてコードを改善します

SonarQube × MCP を試してみよう

上記の4つの処理フロー(生成→解析→取得→修正)に基づき、具体的な実装・操作手順を解説します。
前提として、以下のツールがローカル環境にインストールされているものとします。

  • Docker
  • SonarScanner CLI(パスが通っていること)
  • Gemini Desktop App(またはMCP対応のクライアント)

SonarQube Server の準備

まずは解析結果を受け取るサーバーを立ち上げます。

1. Dockerコンテナの起動

docker run -d --name sonarqube \
  -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true \
  -p 9000:9000 \
  sonarqube:community

2. プロジェクトとトークンの設定

  1. http://localhost:9000 にアクセス(初期ID/Pass: admin / admin
  2. Create Project: 「Manually」でlocalプロジェクトを作成(Project Key: mcp-demo
  3. Generate Token: 右上User Profile->My Account->Security から User Token を発行し、必ず控えておきます

AI Agent (Gemini) のセットアップ

本記事では、MCPクライアントとして Gemini CLIを使用します。VS code, Cousorなどmcpサーバーを対応するIDEも利用可能です。
また、今回使用する sonarqube-mcp-server のソースコード/Dockerイメージは以下で公開しています。

Geminiの場合、~/.gemini/settings.jsonを修正し、mcpセクションにsonarqubeの内容を追加してください。SONARQUBE_URLSONARQUBE_TOKENの更新も適切に行なってください。

{
  "security": {
    "auth": {
      "selectedType": "oauth-personal"
    }
  },
  "mcpServers": {
      "sonarqube": {
        "command": "docker",
        "args": [
          "run",
          "-i",
          "--rm",
          "-e",
          "SONARQUBE_TOKEN",
          "-e",
          "SONARQUBE_URL",
          "mcp/sonarqube"
        ],
        "env": {
          "SONARQUBE_TOKEN": "squ_xxxxxxxxx",
          "SONARQUBE_URL": "http://host.docker.internal:9000"
        }
      }
    }
}

そしてGeminiを起動して、まずはsonarqubeへの接続を試してみましょう

> can you connect to sonarqube server via mcp server?

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✓  get_system_health (sonarqube MCP Server) {}                                                                                                                                              │
│                                                                                                                                                                                             │
│ {                                                                                                                                                                                           │
│   "health" : "GREEN"                                                                                                                                                                        │
│ }                                                                                                                                                                                           │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ Yes, I have successfully connected to the SonarQube server. The server health status is GREEN, which means it is fully operational.

ちなみにMCPサーバーの実体はローカル環境に実行しているDocker Containerです。

❯ docker ps | grep mcp
36ce38cf108d   mcp/sonarqube         "/bin/sh -c '/usr/lo…"   6 hours ago   Up 6 hours                                                 mystifying_jackson

完全自律サイクルの実行

ここからが本番です。AI Agentに対して、先ほどの4段階のフローを実行させます。

Phase 1: AI Agentによるコード生成

まず、AIにベースとなるコードを書かせます。

プロンプト:

「Javascriptで数独のゲームを作ってください。」

AI agentが以下の3つのファイルを作成しました。

  • index.html: ゲームの盤面やボタンを配置するメインのファイル
  • style.css: ゲームを数独盤らしく見せるためのスタイルシート
  • script.js: ゲームのロジック(パズルの生成、解答のチェックなど)を記述するJavaScriptファイル

Phase 2: ソースコードの静的解析 (SonarScanner)

コードができたら、以下のコマンドを実行し、コードを解析し、結果をSonarQube Serverに送信させます。
詳細の設定と説明は割愛します、詳しくは https://qiita.com/xibuka/items/42a93ae2b401d1296052 を参照してください。

sonar-scanner \
  -Dsonar.projectKey=mcp-demo \
  -Dsonar.sources=. \
  -Dsonar.host.url=http://localhost:9000 \
  -Dsonar.token=squ_xxxxxxxxyyyyyyyzzzzzzzz

ここでは解説のために手動でスキャナを実行していますが、MCPの Command Execution 機能を備えたサーバーを追加すれば、AIに「スキャンを実行して」と頼むだけでこのステップも自動化可能です。

Phase 3: MCP経由でのIssue取得

解析が終わったら、AIにその結果を確認させます。ここがMCPの出番です。

プロンプト:

「SonarQubeのmcp-demoのIssueを確認してください。」

AI agentは sonarqube-mcp-server のツールsearch_sonar_issues_in_projectsを呼び出し、以下の情報を取得しました。Issueが思うより多いですね。

✦ mcp-demoプロジェクトで11件のIssueが見つかりました。

  重大 (Critical):
   * script.js (33行目): 関数の認知的複雑度が高すぎます。(Cognitive Complexity)

  メジャー (Major):
   * script.js (165行目): shuffle関数を外部スコープに移動してください。
   * style.css (49行目): テキストと背景のコントラストが不十分です。
   * style.css (69行目): テキストと背景のコントラストが不十分です。

  マイナー (Minor):
   * script.js (56行目): Array()の代わりにnew Array()を使用してください。(2件)
   * script.js (79行目): JSON.parse(JSON.stringify(...))の代わりにstructuredClone(...)を推奨します。
   * script.js (134行目): parseIntの代わりにNumber.parseIntを推奨します。
   * script.js (135行目): isNaNの代わりにNumber.isNaNを推奨します。
   * script.js (142行目): parseIntの代わりにNumber.parseIntを推奨します。
   * script.js (182行目): JSON.parse(JSON.stringify(...))の代わりにstructuredClone(...)を推奨します。

Phase 4: 文脈理解と自動改善

最後に、取得したIssueに基づいてコードを修正させます。

プロンプト:

「検出されたIssueに基づいて、全てのファイルを修正してください。」

AI agentがSonarQubeからのIssueを理解し、以下の修正を行いました。

✦ すべてのSonarQube Issueの修正が完了しました。

  修正内容は以下の通りです。

   * solveSudoku関数をリファクタリングし、複雑度を低減しました。
   * shuffle関数をグローバルスコープに移動しました。
   * style.cssのカラーコントラストの問題を修正しました。
   * Array()をnew Array()に置換しました。
   * JSON.parse(JSON.stringify())をstructuredClone()に置換しました。
   * parseIntおよびisNaNをNumber.parseIntおよびNumber.isNaNに置換しました。

これで、「生成 → 解析 → 確認 → 修正」 のサイクルが完了しました。

試しにもう一度Sonar Scannerをかけてスキャンと行い、Issueが全て修正済みになっていることを確認します。

✦ 再度確認したところ、mcp-demoプロジェクトにオープンなIssueはもうありません。すべてのIssueが解決済み(Closed)になって
  います。

まとめ

このワークフローにより、エンジニアは「大量の警告リストを目視確認し、手作業で修正する」という不毛な時間から解放されます。

AI Agentは単にコードを書くだけでなく、 「SonarQubeという品質のゲートキーパー」と連携し、自らが生み出したコードの品質に責任を持つ ことができるようになりました。

これにより、私たちはコーディングの細部や構文エラーの修正といった「作業」をAIに任せ、 アーキテクチャの設計や、ユーザーにどのような価値を届けるかといった「創造」 に100%集中できるようになります。これこそが、MCPによって実現する次世代のエンジニアリング体験です。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?