代码问题修复服务

SonarQube MCP Server 是一个为AI编程代理设计的服务,用于调查和修复SonarQube问题,提供高信号的问题搜索结果和详细的修复上下文。

  • by SertayKabuk
  • Python
  • 本地部署
  • 5 星标
  • 更新于
在 GitHub 查看 SertayKabuk/sonarqube-mcp

使用说明

SonarQube MCP 服务器

这个项目为需要调查和修复SonarQube问题的AI编码代理打包了一个模型上下文协议(MCP)服务器。该服务器是基于 FastMCP 并且封装了官方的SonarQube REST API以提供:

  • 搜索结果突出显示高信号问题的严重性、负责人和文件位置。
  • 针对特定SonarQube问题的详细修复上下文,包括相关规则描述和修复建议。
  • 直接访问定制工作流的规则元数据。

🧠 这个表情符号通常被用来表示“大脑”或“思考”,在中文里可以翻译为“脑洞”、“思考中”或者简单地用“🧠”来表示(如果上下文允许)。不过,直接翻译这个符号本身并没有固定的意思,更多是根据使用场景来解释。 目标为代理提供足够的结构化上下文,以便其能够理解问题、定位问题代码,并应用推荐的修复方案,而无需访问SonarQube用户界面。

要求

  • Python 3.12+
  • 访问一个SonarQube实例(云服务或自托管),使用能够读取问题和规则的API令牌。
  • 这个(或“该”) fastmcp 软件包已包含在内;未捆绑MCP客户端。

配置

您必须配置您的SonarQube实例的基本URL。认证可以 可通过两种方式提供:

  1. 通过(某种方式)获取每个用户的Bearer令牌 Authorization: Bearer <token> HTTP头部 当使用HTTP/SSE传输方式时(推荐使用——允许每个用户/代理 (具有最小权限访问)。
  2. 一个静态环境变量令牌(SONARQUBE_TOKEN) 用作备用方案 当没有头部信息时(在需要HTTP头部信息的stdio传输中) (不可用)。

在启动服务器之前,请设置以下环境变量:

变量 描述 示例
SONARQUBE_BASE_URL 您的SonarQube实例的基础URL(末尾不要加斜杠) https://sonarqube.internal
SONARQUBE_TOKEN (可选) 使用备用个人访问令牌 Browse 访问项目。仅在未提供授权头时使用。 squ_XXXXXXXXXXXXXXXXXXXXXXXXXXXX
SONARQUBE_TIMEOUT (可选) 请求超时时间(以秒为单位)(默认为 15) 20

你可以把这些存放在一个 .env 文件,或通过您的进程管理器提供它们。

安装

uv sync

对于开发和测试依赖项:

uv sync --extra test

运行服务器

默认情况下,服务器通过标准输入输出(stdio)运行,这对于本地MCP客户端来说非常理想:

uv run python -m src.main

要暴露一个HTTP传输,运行时添加相应的选项:

uv run python -m src.main --transport http --host 0.0.0.0 --port 8765

支持的传输方式与FastMCP中的传输方式相同(stdio, http, sse)。 当 使用 http/sse,发送一个 Authorization 在每个请求中添加头部信息,以便 服务器可以代表该用户执行SonarQube调用:

Authorization: Bearer squ_XXXXXXXXXXXXXXXXXXXXXXXXXXXX

如果省略了头部,服务器将回退到 SONARQUBE_TOKEN。

基于头部的认证示例

服务器内部检查传入的头部信息(通过FastMCP的 get_http_headers) 在每次工具调用时。一个简化的例子:

from fastmcp import FastMCP
from fastmcp.server.dependencies import get_http_headers

mcp = FastMCP(name="Demo")

@mcp.tool
async def who_am_i() -> dict:
	headers = get_http_headers()
	auth = headers.get("authorization", "") if headers else ""
	return {
		"has_auth": bool(auth),
		"auth_is_bearer": auth.lower().startswith("bearer "),
		"user_agent": headers.get("user-agent") if headers else None,
	}

这反映了SonarQube工具用于解决活动(或活跃)问题的机制 每次请求的令牌。

VS Code MCP 客户端配置

如果你正在使用VS Code内置的MCP客户端(或一个能够读取MCP的扩展) mcp.json (风格宣言),您可以提示用户输入他们的 SonarQube 令牌 并将其作为承载头传递。示例配置片段:

{
	"servers": {
		"sonarqube": {
			"url": "http://localhost:8765/mcp",
			"type": "http",
			"headers": {
				"Authorization": "Bearer ${input:sonarqube_token}"
			}
		}
	},
	"inputs": [
		{
			"id": "sonarqube_token",
			"type": "promptString",
			"description": "SonarQube Token"
		}
	]
}

注:

  • 该 ${input:...} 占位符确保令牌不会以明文形式存储 在配置文件中;用户将在VS Code中收到提示。
  • 如果你不想每次都提示,你可以设置环境变量来替代 变量 SONARQUBE_TOKEN 并且省略 headers 块(粒度较粗的用于 (多用户场景)。
  • 当在企业CA后使用HTTPS连接远程SonarQube实例时, 确保您的Python环境信任该证书颁发机构(例如,通过 REQUESTS_CA_BUNDLE / SSL_CERT_FILE)。

可用工具

工具 目的 关键参数
get_issue_context 通过键值获取单个问题,提取其规则,并返回一个富文本格式(Markdown)的简要说明以及机器可读的元数据。 issue_key (字符串)
search_issues 包装/封装在...周围 /api/issues/search 这揭示了最常见的过滤器,并在每个结果中添加了组件路径。 issue_keys, components, severities, issue_statuses, resolutions, types, tags, assignees, languages, created_after, created_before, resolved, sort_field, ascending, page, page_size
get_rule 从(某处)检索原始规则元数据 /api/rules/show。 rule_key (字符串)

所有工具都返回可序列化的JSON字典,从而便于在代理工作流中进行链式调用。

示例工作流程

  1. 呼叫 search_issues 与;和;带有 project="Agrega-Server" 检索未解决问题。
  2. 对于每个问题,请致电 get_issue_context(issue_key).
  3. 使用 markdown 为大型语言模型(LLM)提供领域知识,并进行结构化 issue/rule (将各部分)用于构建自动化修复方案。

以下是根据提供的信息翻译的原文内容: sample_search_api_response.json 和 sample_rule_api_response.json。

测试

安装可选组件后 test 额外:

uv run python -m pytest

该测试使用(某种方法)模拟外部HTTP调用 respx因此,它们离线运行且速度很快。

故障排除

  • 如果服务器启动了但所有工具调用都立即失败,请确保 Authorization 您的 SonarQube 实例已接受请求头,并且您的令牌有权限查看该项目/问题。
  • 你可以调用 configuration_status 工具(仅在服务器配置错误时可用)用于诊断缺失的环境变量。
  • 通过设置启用HTTP级别的日志记录 HTTPX_LOG_LEVEL=debug 在运行以获得更深入可见性的过程时。

路线图/想法

  • 当可通过时,表面代码片段如下: flows 元数据。
  • 缓存规则元数据,以减少长时间会话中的重复请求。
  • 添加工具指标(延迟、错误率)以帮助识别不稳定的集成。