AIのおかげでコーディング速度は劇的に上がりました。しかし、その後の 「品質チェックと手動修正」 が新たなボトルネックになっていませんか?
「AIにコードを書かせる」→「静的解析で大量の警告が出る」→「結局、人間が手作業で直す」。
これでは、AIが生んだ技術的負債を人間が返済しているようなものです。
「AIが出した問題は、AI自身に直させる」
本記事では、SonarQubeとMCPを組み合わせ、解析結果の確認からコード修正までをAIに完結させ、エンジニアを単純作業から解放する方法を解説します。
SonarQube MCP serverとは
これまでの「AIコーディング」と「静的解析」の連携は、基本的にコピー&ペーストでした。
SonarQubeの画面にあるエラーメッセージをコピーし、AIチャットに貼り付け、「これを直して」と頼むしかないです。
MCP (Model Context Protocol) を使うと、AIクライアントが以下のことを自動的に行えるようになります。
- 直接アクセス: SonarQubeのAPIを叩き、現在のプロジェクトのバグやCode Smellを取得する
- 文脈理解: 指摘された箇所のソースコードをローカルファイルから読み取る
- 自動修正: 指摘内容に基づいて修正案を作成し、ファイルに書き込む
つまり、「SonarQubeの指摘を全部直しておいて」の一言で完結する世界です。
アーキテクチャ構成
本システムの全体像は以下の通りです。
AI Agent(Gemini)が「司令塔」となり、コードの生成から静的解析の実行、そして修正までを自律的に行います。
各コンポーネントの役割
- AI Agent (Gemini): 開発者の指示を受け、コード生成、ツール実行(スキャナ)、MCP経由の情報取得、そしてコード修正を行う中心的な存在です
- Source Code (Local): AIによって生成・修正される対象のファイル群です
- SonarQube MCP Server: AIとSonarQubeをつなぐ「翻訳機」です
- SonarQube Server: 解析結果(Issue)を管理するデータベースです
処理フロー
このアーキテクチャでは、以下の4ステップのサイクルをAIが回すことで、高品質なコードを素早く生み出します。
-
コード生成:
まず、AI Agentが開発者の指示(プロンプト)に基づいて初期コードを生成し、ローカルのSource Codeに書き込みます -
静的解析の実行 (SAST Scan):
次に、AI AgentがローカルでSonarScannerツールを起動します。解析結果は自動的にSonarQube Serverに送信・格納されます(図中の点線矢印) -
Issueの取得 (via MCP):
解析完了後、AI AgentはMCP Serverを経由してSonarQube Serverに問い合わせ、直前に検出された「修正すべきIssue」のリストを取得します -
理解と自動改善:
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. プロジェクトとトークンの設定
-
http://localhost:9000にアクセス(初期ID/Pass:admin/admin) -
Create Project: 「Manually」で
localプロジェクトを作成(Project Key:mcp-demo) - 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_URLとSONARQUBE_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によって実現する次世代のエンジニアリング体験です。
