今回は、コード品質管理のデファクトスタンダードである SonarQube を、MCP経由で操作できる 「SonarQube MCP Server」 の機能(Tools)の一つ、静的コード解析 について解説します。
SonarScanner、SonarQube、IDEを設定しなくても、SonarQube MCPサーバ単体でも実はコードも静的解析を実施することも可能です。ただ、本ツールの静的解析は、「手軽さ」と「スピード」 に重点を置いています。 SonarQube (SonarScanner) のような、高度なデータフロー解析や複雑なセキュリティ脆弱性の深掘りまでは行いません。
SonarQube MCP Serverの機能一覧
まずは、提供されている主なツール(Tools)の全容をテーブルでまとめました。これを眺めるだけで、何ができるか概略がつかめるはずです。
SonarQube MCPサーバーのセットアップなどは ここをご参考ください。
| No. | 機能 | 内容・役割 |
|---|---|---|
| 1 | 静的コード解析 | バグ、脆弱性、コードスメル(保守性を下げるコード)を自動的に検出します。 |
| 2 | 品質ゲート | コード品質の基準(例:「重大な脆弱性が0件」)を定義し、クリアしているか自動判定します。CI/CDに組み込むことで、低品質なコードのマージを未然に防ぎます。 |
| 3 | 課題管理 | 検出された問題を一覧化し、開発者への割り当て、ステータス変更(修正済み、誤検知など)、コメント追加などを行えます。 |
| 4 | ダッシュボードと可視化 | プロジェクト全体の品質を概観できます。カバレッジ、重複、複雑度などのメトリクスをグラフで可視化します。 |
| 5 | 多言語対応 | Java, C#, Python, JavaScript, TypeScriptなど主要な言語に対応しています。(プラグインでの拡張も可能) |
| 6 | SCM連携 | GitやSubversionと連携し、**「誰が・いつ」**問題のあるコードをコミットしたかを特定・追跡できます。 |
| 7 | 拡張性 | プラグインを追加することで、新しい言語のサポート、ルールの追加、外部ツールとの連携などが可能です。 |
| 8 | Web APIとWebhook | APIやWebhookを通じて、Jenkins, GitLab CI, Slackなどの外部システムと連携する機能を提供します。 |
静的コード解析
開発の基本となる「静的コード解析」機能です。これは、プログラムを実行することなく、ソースコードを解析してバグや保守性の低い記述(コードスメル)を自動的に検出する機能です。
例えば、開発者が以下のようなPythonコードを書いたとします。一見動くように見えますが、いくつか問題が含まれています。
import json # 【1】使われていないインポート
def login_user(username, password):
# 【2】ハードコードされた認証情報(セキュリティリスク)
if username == "admin" and password == "SuperSecret123":
print("Login successful")
return True
else:
return False
def calculate_area(radius):
pi = 3.14
# 【3】typoによるバグの可能性(未定義変数の参照など)
return pii * radius * radius
入力Prompt例
@test.py に対して静的解析をし、結果をJSONにまとめて
出力例
1 {
2 "file": "test.py",
3 "issues": [
4 {
5 "id": "un_used_import",
6 "severity": "info",
7 "message": "The 'json' module is imported but not used. Consider removing it for cleaner code.",
8 "line": 1,
9 "code_snippet": "import json # 【1】使われていないインポート"
10 },
11 {
12 "id": "hardcoded_credentials",
13 "severity": "critical",
14 "message": "Hardcoded credentials detected. 'admin' and 'SuperSecret123' are directly present in the code, posing a significant security risk. Use environment variables, configuration files, or a secure secrets management system.",
15 "line": 4,
16 "code_snippet": " if username == \"admin\" and password == \"SuperSecret123\":"
17 },
18 {
19 "id": "typo_bug",
20 "severity": "major",
21 "message": "Typo detected: 'pii' is used instead of 'pi'. This will result in a NameError as 'pii' is not defined. Change 'pii' to 'pi'.",
22 "line": 10,
23 "code_snippet": " return pii * radius * radius"
24 }
25 ]
26 }
このように、「どこに」「どんな問題があり」「どう修正すべきか」 のコンテキスト情報をピンポイントで指摘してくれるため、レビューの手間を大幅に削減できます。
また、対話形式で教えてくれるため、経験の浅いメンバーでも納得感を持って修正作業に入ることができます。