Skip to main content
Glama
anggakawa

SonarQube MCP Server

by anggakawa

SonarQube MCP Server

A read-only Model Context Protocol (MCP) server that gives AI assistants structured access to SonarQube — issues, metrics, rules, and projects.

Features

  • 6 read-only tools covering the full SonarQube quality workflow

  • Safe by design — no mutations, every tool returns a consistent {"ok": ...} envelope

  • Input validation before any API call (severities, types, statuses)

  • Structured errors with machine-readable error_code fields

  • Works with SonarQube Community, Developer, and Enterprise editions


Requirements

  • Python 3.10+

  • A running SonarQube instance

  • A SonarQube user token (squ_...)


Installation

pip install sonarqube-mcp-server

Or install from source:

git clone <repo>
cd sonarqube-mcp
pip install -e .

Quick Start

SONARQUBE_URL=http://localhost:9000 \
SONARQUBE_TOKEN=squ_xxxxxxxxxxxx \
sonarqube-mcp-server

Or with python -m:

python -m sonarqube_mcp

Configuration

Environment Variables

Variable

Required

Default

Description

SONARQUBE_URL

No

http://localhost:9000

Base URL of your SonarQube instance

SONARQUBE_TOKEN

Yes

User token for authentication

SONARQUBE_REQUEST_TIMEOUT_SEC

No

30

HTTP request timeout in seconds

Copy .env.example to .env and fill in your values:

cp .env.example .env

Generating a Token

In SonarQube: My Account → Security → Generate Tokens. A user token (squ_...) with Browse permission on the target projects is sufficient for all read-only operations.


MCP Client Integration

Claude Code

Add to your Claude Code MCP settings (~/.claude/claude_code_config.json):

{
  "mcpServers": {
    "sonarqube": {
      "command": "sonarqube-mcp-server",
      "env": {
        "SONARQUBE_URL": "http://localhost:9000",
        "SONARQUBE_TOKEN": "squ_xxxxxxxxxxxx"
      }
    }
  }
}

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "sonarqube": {
      "command": "sonarqube-mcp-server",
      "env": {
        "SONARQUBE_URL": "http://localhost:9000",
        "SONARQUBE_TOKEN": "squ_xxxxxxxxxxxx"
      }
    }
  }
}

Tools

All tools are read-only (readOnlyHint: true, destructiveHint: false).

check_status

Verify connectivity and retrieve server version.

{}

Response:

{
  "ok": true,
  "server_url": "http://localhost:9000",
  "status": "UP",
  "version": "10.4.1"
}

list_projects

List or search SonarQube projects with pagination.

Parameter

Type

Default

Description

query

string

Filter by project name or key

page

integer

1

Page number (1-indexed)

page_size

integer

20

Results per page (1–500)

Response:

{
  "ok": true,
  "total": 42,
  "page": 1,
  "page_size": 20,
  "projects": [
    {"key": "my-app", "name": "My Application", "qualifier": "TRK"}
  ]
}

search_issues

Search issues across all projects or scoped to one project, with rich filtering.

Parameter

Type

Default

Description

project_key

string

Scope to a specific project

severities

string

CSV: INFO, MINOR, MAJOR, CRITICAL, BLOCKER

types

string

CSV: CODE_SMELL, BUG, VULNERABILITY, SECURITY_HOTSPOT

statuses

string

CSV: OPEN, CONFIRMED, REOPENED, RESOLVED, CLOSED

tags

string

CSV of tag names

assigned

boolean

true = assigned only, false = unassigned only

page

integer

1

Page number

page_size

integer

20

Results per page (1–500)

Example — find all open blockers in a project:

{
  "project_key": "my-app",
  "severities": "BLOCKER,CRITICAL",
  "statuses": "OPEN"
}

get_issue

Get full detail for a single issue by key, including text range, effort, assignee, comments, and data-flow information.

Parameter

Type

Description

issue_key

string

Issue key (e.g. AXy1k2m3n4o5p6q7r8)


get_project_metrics

Retrieve the quality dashboard for a project. Returns a standard set of metrics by default, or a custom selection.

Parameter

Type

Default

Description

project_key

string

Required. Project key

metric_keys

string

See below

CSV of metric keys

Default metrics: bugs, vulnerabilities, code_smells, security_hotspots, coverage, duplicated_lines_density, ncloc, sqale_index, reliability_rating, security_rating, sqale_rating, alert_status, quality_gate_details

Response:

{
  "ok": true,
  "project_key": "my-app",
  "project_name": "My Application",
  "metrics": {
    "bugs": "3",
    "coverage": "78.4",
    "alert_status": "OK"
  }
}

get_rule

Retrieve the description and metadata for a SonarQube rule.

Parameter

Type

Description

rule_key

string

Rule key (e.g. python:S1192, java:S106)


Error Handling

All tools return a consistent envelope. On failure:

{
  "ok": false,
  "error_code": "auth_error",
  "message": "Authentication failed. Check SONARQUBE_TOKEN.",
  "details": {}
}

error_code

Cause

auth_error

Invalid or missing token (HTTP 401)

forbidden

Token lacks permissions (HTTP 403)

not_found

Project, issue, or rule does not exist (HTTP 404)

connection_error

Cannot reach the SonarQube instance

timeout

Request exceeded SONARQUBE_REQUEST_TIMEOUT_SEC

invalid_input

Bad parameter value (e.g. unknown severity)

api_error

Other non-2xx SonarQube response

internal_error

Unexpected server-side error


Development

Setup

pip install -e ".[dev]"

Running Tests

pytest

Project Layout

src/sonarqube_mcp/
├── server.py             # FastMCP server, tool definitions, main()
├── sonarqube_client.py   # httpx.Client wrapper for SonarQube REST API
├── settings.py           # Frozen dataclass + env var loading
├── errors.py             # SonarQubeError + error_response()
├── __main__.py           # python -m sonarqube_mcp entrypoint
└── __init__.py

tests/
├── conftest.py
├── test_server.py
├── test_client.py
├── test_settings.py
└── test_errors.py

Architecture Notes

  • create_server() is a factory that captures settings and client in closure scope — makes unit testing straightforward by injecting a pre-built SonarQubeSettings.

  • @_safe_tool wraps every tool so it never raises — exceptions are caught and returned as structured error envelopes.

  • _clamp() keeps page_size within SonarQube's supported API limits (1–500).

  • Settings use a frozen=True dataclass — immutable after load, safe to share across tool closures.


License

MIT

-
security - not tested
F
license - not found
-
quality - not tested

Resources

Looking for Admin?

Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.

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/anggakawa/sonarqube-ce-mcp'

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