
Mcp Zuul
io.github.imatza-rhPublished by GitHub account imatza-rhv0.11.0Updated Oct 24, 2026
Zuul CI — build failure analysis, log search, pipeline status, and job configuration
Overview
An MCP server for Zuul CI that lets an assistant inspect builds, parse failures, search logs, and check pipeline status.
- What you can do
- Exposes roughly 48 tools over the Zuul REST API for builds, buildsets, pipelines, jobs, projects, and nodepool infrastructure. It parses job-output.json into structured failure data (task, host, error, return code), reads and greps any build log file with line ranges, parses JUnit XML test results, and computes flaky-job statistics. It also offers live pipeline status, job dependency graphs, and optional ML log anomaly detection via LogJuicer.
- When to use it
- Useful when debugging failing CI builds, checking whether a change is queued or running, investigating why jobs are not triggering, or auditing job configuration and node availability in a Zuul instance. It replaces clicking through the Zuul web UI and manual JSON parsing.
- Requirements
- Runs locally over stdio, typically via uvx or pip. Requires ZUUL_URL; optional settings include ZUUL_DEFAULT_TENANT, ZUUL_AUTH_TOKEN, ZUUL_USE_KERBEROS, ZUUL_TIMEOUT, ZUUL_VERIFY_SSL, tool filtering variables, and LOGJUICER_URL. Kerberos support needs a valid ticket and the gssapi package; live console streaming needs an extra install. Network access to the Zuul instance and log hosts is required.
Installation
In SourceWeft
- Open Mcp Zuul in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
mcp-zuul
[PyPI] [Python] [License] [CI] [MCP] [Downloads] [codecov] [Listed on AiList]
Debug build failures by asking questions, not clicking through web UIs. An MCP server for Zuul CI.
[mcp-zuul diagnosing a build failure]
If mcp-zuul saves you a debugging session, a ⭐ star helps others find it.
One command, no install:
48 tools, 5 prompts, 3 resources — covering builds, logs, pipelines, jobs, infrastructure, and live status. Works with Claude Code, Claude Desktop, Cursor, Codex, Windsurf, and any MCP-compatible client.
Why mcp-zuul?
Quick Start
uvx (no install, recommended):
pip:
Docker:
LobeHub — send this to your AI agent:
See Setup for full configuration options including Kerberos and multi-instance.
Features
Structured failure analysis — get_build_failures parses Zuul's job-output.json and returns exactly which Ansible task failed, on which host, with error message, return code, and stderr. No log scrolling needed.
Read any log file — get_build_log isn't limited to job-output.txt. Pass log_name to read any file in the build's log directory (ci_script logs, ansible.log, deployment logs) with full grep, tail, and line-range support.
Precise log navigation — Jump to exact line ranges with start_line/end_line. After finding an error at line 6148, read lines 6130-6160 instead of scrolling through 200-line chunks.
Smart grep — Regex search with context lines. Auto-converts common shell-grep \| syntax to Python regex | so patterns like error\|failed\|timeout just work.
Live pipeline awareness — get_change_status returns live job progress with elapsed times, estimated completion, and pre-failure detection (pre_fail field). When the change isn't in pipeline, automatically fetches the latest completed buildset.
Tool filtering — Reduce LLM tool-selection noise with ZUUL_ENABLED_TOOLS or ZUUL_DISABLED_TOOLS. Only expose the tools your workflow needs — the rest are removed from the server entirely.
URL-based input — Paste a Zuul build URL directly. Tools auto-parse the tenant and UUID from URLs like https://zuul.example.com/t/tenant/build/abc123 — no manual extraction needed.
Flaky job detection — find_flaky_jobs analyzes recent build history and computes pass/fail statistics to identify intermittent failures automatically.
Job dependency graph — get_freeze_jobs returns the fully-resolved job graph for a pipeline/project/branch, showing all jobs with their dependencies after inheritance resolution.
Kerberos/SPNEGO auth — First-class support for Zuul instances behind OIDC + Kerberos. Drives the full SPNEGO redirect chain automatically. Session cookies persist and re-authenticate transparently on expiry.
Streamable HTTP transport — Run as a persistent HTTP server with MCP_TRANSPORT=streamable-http for remote/shared deployment. Supports stdio (default), SSE, and streamable-http.
Write operations — Enqueue/dequeue/promote changes and re-enqueue buildsets. Pipeline-affecting tools are disabled by default (ZUUL_READ_ONLY=true) and removed from the server entirely so LLMs don't even see them. Autohold management (create/delete) is always available since it doesn't affect running pipelines.
LogJuicer integration — get_build_anomalies uses ML-based log analysis to find unusual lines by comparing failed logs against successful baselines. Optional — requires LOGJUICER_URL.
Token-efficient output — All responses strip None values and use compact formatters. tail_build_log returns just the last N lines — the fastest way to check why a build failed.
Error handling — All tools return JSON, errors included. Network failures, auth issues, and invalid parameters produce {"error": "descriptive message"}. Tools never raise unhandled exceptions.
Tools
Builds & Failures
Buildsets
Pipeline & Status
Jobs & Projects
Infrastructure
Write Operations
Pipeline-affecting operations — disabled by default (ZUUL_READ_ONLY=true). Set ZUUL_READ_ONLY=false to enable. Requires auth token or Kerberos. Autohold management (create/delete) is always available since it doesn't affect running pipelines.
Test Results & Log Analysis
Prompts
Pre-built prompt templates that pre-load context and guide analysis:
Resources
Browsable context that clients can attach to conversations without tool calls:
Setup
MCP client configuration
All clients use the same JSON structure. Add to your client's MCP config file:
Claude Code (~/.claude.json → mcpServers):
Claude Desktop (claude_desktop_config.json), Cursor (.cursor/mcp.json), and other MCP clients use the same format. GUI-based clients don't inherit your shell PATH - use the full path to uvx (run which uvx to find it).
Or via CLI:
Environment variables
Token authentication
Pass ZUUL_AUTH_TOKEN via host environment — never hardcode tokens in config files (visible in ps output):
For Docker, forward without a value to inherit from host:
Kerberos / SPNEGO
For Zuul behind OIDC + Kerberos. Requires a valid Kerberos ticket (kinit) and the gssapi package.
Linux prerequisites - gssapi has no pre-built Linux wheels and must compile from source:
macOS and Windows have pre-built wheels - no extra packages needed.
Then install with Kerberos support:
Via CLI:
Or via JSON config:
For Docker, mount the Kerberos ticket cache:
Multiple instances
Add separate entries per Zuul instance:
Troubleshooting
krb5-config: not found or Python.h: No such file when installing mcp-zuul[kerberos] on Linux:
gssapi has no pre-built Linux wheels - it compiles from source. Install system packages first:
uvx: command not found in Cursor or Claude Desktop:
GUI-based MCP clients don't inherit your shell PATH. Use the full path to uvx:
Then use that absolute path as command in your MCP config:
Permission errors on ~/.local/share/uv/:
If uv was previously run with sudo, the cache directory may be root-owned:
Usage Examples
Debug a build failure
→ list_builds(project="my-project", result="FAILURE", limit=1) → get_build_failures(uuid="...") → root cause with task name, error, and return code.
Deep-dive into logs
→ browse_build_logs(uuid="...", path="controller/ci-framework-data/logs/") → finds ci_script_008_run.log → get_build_log(uuid="...", log_name="controller/ci-framework-data/logs/ci_script_008_run.log", grep="error|timed out|Error 1", context=2) → exact error with surrounding context.
Navigate to a specific error
→ get_build_log(uuid="...", start_line=6478, end_line=6484) → exactly those 7 lines.
Check live pipeline status
→ get_change_status(change="54321") → live jobs with elapsed times and ETA, or latest completed buildset if not in pipeline.
Compare build results across a pipeline
→ list_builds to get buildset_uuid → get_buildset(uuid="...") → all sibling builds with results and durations.
Paste a Zuul URL directly
→ get_build_failures(url="https://zuul.example.com/t/tenant/build/abc123def") → tenant and UUID auto-extracted.
Debug why a job isn't running
→ get_config_errors(project="org/my-project") → configuration errors, missing refs, or repo access issues.
Check node availability
→ list_nodes() → node states with by_state summary → list_labels() → available node types.
Detect flaky jobs
→ find_flaky_jobs(job_name="my-deploy-job", limit=30) → pass/fail stats, failure rate, flaky=true/false.
See what jobs run for a project
→ get_freeze_jobs(pipeline="check", project="openstack-k8s-operators/openstack-operator") → resolved job graph with dependencies.
Quick log tail
→ tail_build_log(uuid="...", lines=30) → just the tail, minimal tokens.
What nodeset does my job use after inheritance?
→ get_freeze_job(pipeline="check", project="org/repo", job_name="deploy-job") → resolved nodeset, playbooks, variables, timeout after all parent inheritance.
Development
Architecture
See CLAUDE.md for full architecture details.
Listings
[mcp-zuul MCP server]- PyPI —
pip install mcp-zuul - Glama — Quality: A/A/A
- Conare — Marketplace listing
- PulseMCP — Server directory
- LobeHub — MCP marketplace with agent install
- HiFriendBot — AI tools directory
- pepy.tech — Download statistics
- Docker —
ghcr.io/imatza-rh/mcp-zuul
Contributing
Contributions welcome. Please open an issue first to discuss significant changes.
License
Apache-2.0
Source: README.md at commit e1a0ffa
Tools
0Version history
1- v0.11.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts