A Model Context Protocol (MCP) server for interacting with Prow CI/CD systems, retrieving build logs, and diagnosing PR build issues.
- 🔍 Job Management: Get latest job runs and retrieve job logs
- 📊 Build Analysis: Find builds for specific PRs and analyze results
- 🚀 Smart Discovery: Multi-strategy PR build finding with fallback mechanisms
- 🔧 Diagnostics: Comprehensive PR build status diagnosis and test failure extraction
The server exposes 7 MCP tools:
get_latest_job_run- Get the latest job run information for a specific job nameget_job_logs- Retrieve logs for a specific Prow job IDget_build_logs- Get logs for a specific build ID and job nameget_latest_prow_build_for_pr- Find the latest Prow build for a GitHub PRget_prow_logs_from_pr- Get comprehensive logs for a specific PRdiagnose_pr_build_status- Comprehensive diagnostic tool for PR build issuesget_test_failures_from_artifacts- Extract test failures from build artifacts
Check out the examples directory.
cd /path/to/prow-mcp-server
uv sync # Creates venv and installs dependencies from uv.lock
source .venv/bin/activate # On Windows: .venv\Scripts\activateAdd to your ~/.cursor/mcp.json:
{
"mcpServers": {
"prow": {
"command": "uv",
"args": ["run", "/path/to/prow-mcp-server/.venv/bin/python", "/path/to/prow-mcp-server/main.py"],
"description": "MCP server for Prow CI/CD integration"
}
}
}For web applications or services that need HTTP-based communication:
{
"mcpServers": {
"prow": {
"url": "http://0.0.0.0:8000/sse/",
"description": "MCP server for Prow CI/CD integration with direct SSE",
"env": {
"MCP_TRANSPORT": "sse"
}
}
}
}SSE Endpoint: http://0.0.0.0:8000/sse/
Note: Make sure to start the SSE server separately with
MCP_TRANSPORT=sse uv run main.pybefore using this configuration.
Run the comprehensive test suite (18 tests):
uv run python run_tests.py # Recommended
uv run pytest tests/ -v # Direct pytestAll tests pass in under 0.25 seconds with full coverage of utilities, services, and MCP tools.
The server uses a modular architecture with clear separation of concerns:
mcp_server/
├── main.py # Server entry point
├── config.py # Configuration
├── models/ # Type definitions
├── utils/ # Helper functions
├── services/ # Business logic (Prow API, GCS)
└── tools/ # MCP tool implementations
The server uses intelligent fallback strategies to find PR builds:
- Active Prow Jobs (real-time) →
- GCS PR Logs (archived) →
- GCS Regular Logs (metadata scanning) →
- Pattern-based Search (heuristic fallback)
For standard MCP integration with Cursor IDE:
# Build
podman build -t prow-mcp:latest .
# Run
podman run -i --rm prow-mcp:latest
# MCP Config
{
"mcpServers": {
"prow-server": {
"command": "podman",
"args": ["run", "-i", "--rm", "localhost/prow-mcp:latest"]
}
}
}For web-based integrations and HTTP communication:
# Build SSE container
podman build -f Containerfile.sse -t prow-mcp-sse:latest .
# Run SSE container
podman run -p 8000:8000 --rm prow-mcp-sse:latest
# MCP Config
{
"mcpServers": {
"prow-sse": {
"url": "http://localhost:8000/sse/",
"description": "MCP server for Prow CI/CD integration with SSE transport",
"env": {
"MCP_TRANSPORT": "sse"
}
}
}
}SSE Endpoint: http://localhost:8000/sse/
Note: The SSE container automatically configures
MCP_TRANSPORT=sse,MCP_HOST=0.0.0.0, andMCP_PORT=8000environment variables.
Optional environment variables (can be configured in mcp.json or shell):
DEFAULT_ORG_REPO: Organization and repository (e.g.,redhat-developer_rhdh). Used as default when not specified in tool calls. Agents can infer org/repo from user context (GitHub URLs, repository mentions, etc.)DEFAULT_JOB_NAME: Default Prow job name (e.g.,pull-ci-redhat-developer-rhdh-main-e2e-tests). Used as default when not specified in tool calls. Agents can infer job names from user questions (test type mentions, Prow URLs, etc.)API_KEY: For authenticated requests to access QE private Prow jobsMCP_TRANSPORT: Transport method (stdio(default),sse,http)MCP_HOST: Host for sse/http transport (default:127.0.0.1)MCP_PORT: Port for sse/http transport (default:8000)
Note:
DEFAULT_ORG_REPOandDEFAULT_JOB_NAMEare now optional. Tools can accept these parameters per-request, and AI agents can intelligently infer them from user context such as GitHub URLs, repository mentions, or test type keywords.
{
"mcpServers": {
"prow-stdio": {
"command": "uv",
"args": ["run", "python", "/path/to/prow-mcp-server/main.py"],
"description": "MCP server for Prow CI/CD integration"
}
}
}{
"mcpServers": {
"prow-stdio": {
"command": "uv",
"args": ["run", "python", "/path/to/prow-mcp-server/main.py"],
"description": "MCP server for Prow CI/CD integration",
"env": {
"DEFAULT_ORG_REPO": "redhat-developer_rhdh",
"DEFAULT_JOB_NAME": "pull-ci-redhat-developer-rhdh-main-e2e-tests",
"API_KEY": "your-api-key-here"
}
}
}
}Default settings work for most other configurations:
- Prow URL:
https://prow.ci.openshift.org - GCS URL:
https://gcsweb-ci.apps.ci.l2s4.p1.openshiftapps.com/gcs/test-platform-results
stdio(default): Standard input/output transport for Cursor IDEsse: Server-Sent Events for web-based integration (runs HTTP server on port 8000)
- Import Errors: Use
main.pyentry point - Missing Tools: Verify all tool registration functions are called
- Authentication: Set
API_KEYenvironment variable if needed - Network Issues: Check connectivity to Prow and GCS endpoints
Use the built-in diagnostic tool for PR-specific issues:
# Through MCP: "Diagnose why PR 3191 builds are failing"- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Add tests for new functionality
- Run test suite:
uv run python run_tests.py - Submit pull request
🚀 Clean, modular, and well-tested MCP Prow Server ready for use!