使用说明
Jenkins调查员MCP服务器
A. 模型上下文协议 该服务器可帮助AI助手高效调试失败的Jenkins CI作业,而无需打开上下文窗口。
注: 这个代码库是在人工智能的帮助下生成的(Claude/Cursor),并由人类进行审查、测试和验证。
运作原理
原始的Jenkins API响应是巨大的。此服务器充当过滤器:它获取详细数据,去除噪声,只返回重要的内容——错误片段、提交消息、失败的测试。
工具
Bundles——从这里开始
捆绑将多个API调用合并为一个工具调用,从而节省了令牌和延迟。
| 捆绑 | 它做什么 |
|---|---|
investigate_build_failure |
主要入口点。 在一次调用中返回构建信息、阶段、错误、测试、提交、参数和趋势。 |
compare_failing_vs_passing |
区分上次失败与上次通过的构建:参数更改、代理、触发器、累积提交。 |
deep_dive_test_failures |
通过最近的构建追溯每个失败的测试,以找到回归点和可疑提交。如果可用,则丰富JUnitXML工件(故障分类、爆炸半径检测、扩展的stdout/stderr)。 |
analyze_flaky_job |
按节点、阶段和一天中的时间对片状和集群故障进行评分。 |
diagnose_infrastructure_issue |
检查节点健康状况和每个节点的故障相关性,以确定故障是否与基础设施有关。 |
search_across_jobs |
在文件夹中的所有作业的控制台日志中搜索特定的错误模式。并发,具有状态过滤和提前终止功能。 |
triage_folder |
扫描文件夹中连续失败计数的中断作业——团队健康仪表板。 |
个人工具
在捆绑包为您提供大局后,使用这些进行有针对性的跟进。
| 工具 | 何时使用 |
|---|---|
get_last_build_info |
从作业名称中发现最新(或最新失败)的内部版本号。 |
list_jobs |
浏览Jenkins文件夹中的作业。 |
get_build_summary |
快速构建概述:状态、运行时、代理、触发器。 |
get_pipeline_stages |
带有状态和持续时间的舞台表。 |
get_build_parameters |
请参阅构建参数(分支、环境、标志)。 |
get_build_history |
最近的构建结果和趋势分析。 |
get_scm_changes |
在此版本中提交(Git、SVN、Mercurial)。 |
get_error_logs |
从控制台日志中提取优先级错误(≤250行)。 |
get_stage_logs |
从特定管道阶段的日志中提取错误。 |
search_console_log |
使用上下文行在控制台日志中查找字符串或正则表达式。 |
get_test_failures |
测试失败,出现错误消息和堆栈跟踪。 |
get_build_artifacts |
列出工件或获取特定工件的内容。 |
get_job_config |
解析的作业配置:SCM、触发器、代理标签、管道定义。 |
get_build_environment |
CI相关环境变量(需要EnvInject插件)。 |
get_queue_info |
构建队列,说明构建等待的原因。 |
compare_builds |
区分任意两个构建(参数、代理、触发器、提交)。 |
get_upstream_downstream_builds |
构建的上游触发链。 |
get_node_status |
代理联机状态和磁盘空间。 |
get_node_list |
所有带有标签、执行器和磁盘空间的代理。 |
get_pipeline_flow_nodes |
阶段内的并行分支和步骤级细节。 |
设置
1.安装依赖项
pip install uv
uv pip install -e .
或者用普通pip:
pip install fastmcp>=3.0.0 requests>=2.31 pydantic>=2.0 python-dotenv>=1.0
2.配置凭据
cp .env.example .env
编辑 .env:
JENKINS_URL=http://your-jenkins:8080
JENKINS_USER=your-username
JENKINS_TOKEN=your-api-token
您的API令牌可以从Jenkins生成→ 用户→ 配置→ API令牌。
3.运行服务器
python server.py
默认情况下,服务器以Streamable HTTP传输启动 0.0.0.0:8000。您将在启动时看到打印的本地和网络URL。
4.从Cursor/Claude桌面连接
HTTP传输(默认):
{
"mcpServers": {
"jenkins-investigator": {
"url": "http://192.168.1.42:8000/mcp"
}
}
}
将IP替换为服务器启动时打印的网络URL。
标准运输 (套 MCP_TRANSPORT=stdio 在 .env):
{
"mcpServers": {
"jenkins-investigator": {
"command": "python",
"args": ["/absolute/path/to/jenkins-mcp/server.py"],
"env": {
"MCP_TRANSPORT": "stdio",
"JENKINS_URL": "http://your-jenkins:8080",
"JENKINS_USER": "your-username",
"JENKINS_TOKEN": "your-api-token"
}
}
}
}
职位名称
对于简单作业,直接使用作业名称: my-job.
对于文件夹或多分支管道中的作业,请使用斜线分隔的路径:
my-org/my-repo/main
服务器自动将其转换为正确的Jenkins API路径(/job/my-org/job/my-repo/job/main/).
配置
环境变量
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
JENKINS_URL |
是 | -- | Jenkins实例的基本URL |
JENKINS_USER |
没有* | -- | Jenkins用户名(没有每个请求头时回退) |
JENKINS_TOKEN |
没有* | - | Jenkins API令牌(当没有per-request头时回退) |
JENKINS_VERIFY_SSL |
没有 | true |
设置为 false 适用于具有自签名或内部CA证书的Jenkins |
REQUESTS_CA_BUNDLE |
否 | -- | 公司/内部CA的CA证书文件路径 |
MCP_TRANSPORT |
没有 | http |
传输协议: http (流式HTTP)或 stdio |
MCP_HOST |
没有 | 0.0.0.0 |
绑定HTTP传输地址 |
MCP_PORT |
没有 | 8000 |
HTTP传输端口 |
TOOL_DELAY_SECONDS |
没有 | 2 |
工具调用之间的延迟,以避免达到AI提供商TPM限制 |
*不使用按请求身份验证标头时需要。
每用户身份验证(HTTP标头)
当部署为共享服务器时,每个用户通过其Cursor MCP配置中的HTTP标头提供自己的Jenkins凭据:
| 标题 | 描述 |
|---|---|
X-Jenkins-User |
Jenkins用户名 |
X-Jenkins-Token |
Jenkins API令牌 |
每请求标头的优先级高于服务器范围 JENKINS_USER / JENKINS_TOKEN env变量。
文档
看 建筑学 用于系统设计、层职责和弹性策略。
看 刀具流 用于决策树、捆绑内部和每个工具的快速参考。
项目结构
jenkins-mcp/
├── server.py # FastMCP server — 20 individual tools + 7 bundles
├── utils/
│ ├── __init__.py
│ ├── jenkins_api.py # Jenkins REST wrappers with retry/backoff
│ ├── junit_parser.py# JUnit XML parser (assertion vs exception classification, blast radius)
│ ├── log_parser.py # Priority-budgeted error extraction
│ └── scm.py # changeSet/changeSets normalization across SCMs
├── docs/
│ ├── architecture.md # System design and layer diagrams
│ └── tool-flow.md # Decision trees and bundle internals
├── tests/ # pytest suite (162 tests)
├── .env # Your credentials (gitignored)
├── .env.example # Template
├── .gitignore
└── pyproject.toml
OpenShift部署
先决条件
ocCLI已登录到集群- 可从集群访问的容器注册表(例如。
images.paas.redhat.com) - Jenkins CA证书文件(
jenkins-ca.pem)
1.建立和推广形象
IMAGE=images.paas.redhat.com/your-org/jenkins-investigator:latest
podman build -t $IMAGE .
podman push $IMAGE
2.创建命名空间资源
NAMESPACE=your-namespace
# Create the secret with Jenkins credentials
oc create secret generic jenkins-investigator-credentials \
--from-literal=JENKINS_URL="https://jenkins-csb-ant-main.dno.corp.redhat.com/" \
--from-literal=JENKINS_USER="your-username" \
--from-literal=JENKINS_TOKEN="your-api-token" \
-n $NAMESPACE
# Create the CA certificate ConfigMap
oc create configmap jenkins-investigator-ca \
--from-file=jenkins-ca.pem=/path/to/jenkins-ca.pem \
-n $NAMESPACE
3.部署
更新 IMAGE_REGISTRY/jenkins-investigator:latest 在 k8s/deployment.yaml 到您的实际图像,然后:
oc apply -f k8s/deployment.yaml -n $NAMESPACE
oc apply -f k8s/service.yaml -n $NAMESPACE
oc apply -f k8s/route.yaml -n $NAMESPACE
4.从游标连接(根据用户设置)
获取路由URL:
oc get route jenkins-investigator -n $NAMESPACE -o jsonpath='{.spec.host}'
每个用户都会将此添加到他们的 ~/.cursor/mcp.json,使用他们 拥有 Jenkins API令牌:
{
"mcpServers": {
"jenkins-investigator": {
"url": "https://<route-host>/mcp",
"headers": {
"X-Jenkins-User": "your-jenkins-username",
"X-Jenkins-Token": "your-jenkins-api-token"
}
}
}
}
生成Jenkins API令牌:Jenkins→ 您的个人资料(右上角)→ 配置→ API代币→ 添加新令牌。
无标题: 如果
JENKINS_USER和JENKINS_TOKEN在服务器Secret中设置,没有标头的请求将回退到这些凭据。如果既没有设置headers也没有设置env变量,服务器将返回错误。
清单参考
| 文件 | 目的 |
|---|---|
k8s/secret.yaml |
Jenkins凭据模板(使用 oc create secret 而是用于实际部署) |
k8s/configmap-ca.yaml |
Jenkins CA证书模板 |
k8s/deployment.yaml |
使用证书装载和健康检查进行部署 |
k8s/service.yaml |
8000端口上的集群IP服务 |
k8s/route.yaml |
带TLS边缘终止的OpenShift路由 |
安全
- 凭据仅从环境变量中读取,从不进行硬编码。
- 服务器是 只读:没有工具可以删除作业、擦除工作区或触发构建。
- 这个
.env默认情况下,文件为gitignore。 - 控制台日志的上限为10 MB,以防止大型构建中的内存耗尽。
