albs-mcp
OfficialAn MCP server/CLI for AlmaLinux Build System (ALBS) that provides read-only build/log investigation and JWT-authenticated build, signing, release-plan, and errata operations, with destructive release commit and build deletion blocked.
Browse platforms, products, flavors, builds, release plans, errata, sign keys, and sign task status.
Inspect build details, tasks, failures, packages, architectures, linked builds, and log files.
Search, download, tail, and range-read build logs with auto-download and paging.
Create builds across one or multiple platforms, including branch/tag/SRPM/Git URL builds and mock options.
Sign builds with a selected sign key and check signing status.
Create scheduled release plans; the actual release is never performed.
Preview and create AlmaLinux advisories from CVE(s)/RHSA and build(s), with duplicate detection.
Works read-only without a token; JWT is required for authenticated actions.
commit_releaseanddelete_buildare intentionally blocked for safety.
Provides tools for interacting with AlmaLinux Build System (ALBS), enabling AI agents to manage builds, sign packages, create release plans, and investigate build failures.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@albs-mcp investigate build 52679"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
albs-mcp
MCP server and CLI for AlmaLinux Build System (ALBS).
Gives AI coding assistants direct access to ALBS — investigate build failures, create builds, sign packages, all through natural language.
Two ways to use:
MCP server | CLI + Skill | |
How it works | AI calls tools via MCP protocol | AI runs |
Setup | Add to MCP config | Install |
Best for | Dedicated ALBS workflow | Lightweight setup, avoiding MCP context pollution |
Works without AI | No | Yes ( |
What it can do
Without a token (read-only)
Investigate build failures — the main use case. Give the agent a build ID and it greps the logs for the failure signatures (
search_log), pinning the exact file, line, and diagnostic, then widens the context around it. No guessing at line offsets and no burning tokens on 100k+ line log files.Get build details — statuses of all tasks, packages, architectures, sign tasks.
List and search builds — browse recent builds, filter by package name or status.
Get platforms — dynamically fetched list of all platforms and their supported architectures.
Download and read logs — any log file from any build: grep it (
search_log), page it bottom-up (read_log_tail), or read a line range. No read can blow up: each line is clipped to 500 chars and the whole result to 40k chars (max_line_chars=0/max_chars=0to lift), so a log whose single lines run to several KB of compiler flags comes back in pages that join up exactly instead of one oversized blob. Reading auto-downloads the log if it isn't on disk yet.Check sign status — see whether sign tasks for a build completed or failed.
List products — all release targets (products) with their platforms, official/community flag, and IDs.
View release plans — status, source packages, and target repositories of any existing release.
View and preview errata — look up any advisory (
get_errata), and preview the AlmaLinux advisories a CVE/RHSA + build(s) would produce (preview_errata) before creating them.
With a JWT token (authenticated)
Create builds — specify packages, platform(s), branch/tag/SRPM. Supports multiple platforms in a single build (e.g. AlmaLinux-8 + AlmaLinux-9). Architectures default to each platform's full list unless you override. Supports custom Git URLs for repos outside
git.almalinux.org(e.g. GitHub, GitLab). Supports all mkbuild.py options: linked builds, mock definitions, excludes, flavors, secureboot, modules, with/without.Sign builds — create sign tasks with a chosen key.
List sign keys — see available keys with IDs and platform mappings.
Create release plans — build a scheduled release plan for a build (which packages go to which repositories) targeting a chosen platform + product. The actual release is never performed — this only creates the plan; committing/publishing is intentionally blocked.
Create errata — AlmaLinux-issued advisories (
ALSA-YYYY:A001, …). You give only the package (or module), its CVEs — or one RHSA — and the build(s); the build may contain other packages. Everything else is automatic: the ID (next free AlmaLinux number of the year, one counter for all platforms), dates (today), title, description (the package text from the newest earlier advisory for that package + the CVE fix list), CVE information and references (CVE + bugzilla) from Red Hat, the module of a modular build (nodejs:24), and the package's RPMs. With an RHSA, title, description, CVEs and severity all come from the RHSA. One advisory per platform and package — a build plus its retry build merge into one. An advisory that would repeat an existing one (same platform, package and CVEs — e.g. the ALSA imported from the RHSA) is flagged and not created unless forced. Creating an advisory does not release it.Delete builds — intentionally blocked for safety.
Log types
ALBS produces several log files per build task. The key ones for debugging:
Log | What's inside |
| Chroot setup, dependency resolution. Check first — if deps failed, nothing else matters. |
| Stderr output from the build process. Often has the clearest error message. |
| Full build log (can be 100k+ lines). The complete rpmbuild output — where compile errors live. Grep it with |
| Mock state transitions. |
| Hardware info of the build node. |
| List of packages installed in the chroot. |
| ALBS-level task log (task assignment, upload). |
| Mock configuration used for the build. |
Related MCP server: Kerneldev MCP
Install
pip install git+https://github.com/AlmaLinux/albs-mcp.gitThis installs both the MCP server (albs-mcp) and the CLI (albs).
Authentication
The JWT token is read from (checked in order):
ALBS_JWT_TOKENenvironment variable~/.albs/credentialsfile (Python dict with atokenkey):
{"token": "eyJ..."}Without a token both MCP and CLI work in read-only mode.
Never commit real tokens. Use env vars or
~/.albs/credentials, not CLI arguments.
Setup option 1: MCP server
Add to your MCP client config (e.g. mcp.json or equivalent):
{
"mcpServers": {
"albs": {
"command": "albs-mcp"
}
}
}Setup option 2: CLI + Skill
For setups where MCP context pollution is a concern, or when using tools that don't support MCP.
Step 1. Install the package (same as above — gives you the albs command):
pip install git+https://github.com/AlmaLinux/albs-mcp.gitStep 2. Add the workflow instructions to your AI tool:
# Copy the skill directory to your tool's skills location, e.g.:
cp -r skills/albs-cli <YOUR_SKILLS_DIR>/albs-cliOr copy the contents of skills/albs-cli/SKILL.md into your project's AGENTS.md or equivalent instructions file.
The skill teaches the AI agent the same workflows (investigation order, EPEL handling, signing) but via albs shell commands instead of MCP tool calls.
Step 3. Verify:
albs --helpThe CLI also works standalone — no AI needed. Useful for scripts and manual terminal use.
CLI usage
# List platforms
albs platforms
# Investigate a build
albs build-info 52679
albs failed-tasks 52679
# log-search greps for the failure and shows it with context — start here.
# It auto-downloads the log if needed (download-log is optional)
albs log-search 52679 "mock_build.395391.1772974729.log"
# ...or grep for something specific
albs log-search 52679 "mock_build.395391.1772974729.log" -e "Hunk #\d+ FAILED" -A 3
# When the search finds nothing, page the log bottom-up: each page prints the
# exact command for the page above it, so the pages join up with no gaps
albs log-tail 52679 "mock_build.395391.1772974729.log"
albs log-tail 52679 "mock_build.395391.1772974729.log" --before-line 772
# Search builds
albs search --project bash --page 2
# Create a build (requires JWT)
albs create-build AlmaLinux-9 bash --branch c9s
albs create-build AlmaLinux-10 https://example.com/pkg.src.rpm \
--from-srpm --add-epel-dist --arch x86_64_v2 \
--flavor EPEL-10 --flavor EPEL-10_altarch
# Build on multiple platforms at once
albs create-build AlmaLinux-8 bash --branch c9s \
--add-platform AlmaLinux-9
# Build from an external Git repo (e.g. GitHub)
albs create-build AlmaLinux-10 \
--git-url https://github.com/ykohut/leapp-data.git \
--branch devel-ng-0.23.0
# Independent tasks (disable the default sequential per-platform task chain,
# so packages build in parallel within each platform)
albs create-build AlmaLinux-9 bash glibc openssl --branch c9s --independent-tasks
# Sign a build (requires JWT)
albs sign-keys
albs sign-build 52679 --key-id 4
# Check whether signing finished
albs sign-status 52679
# List products (release targets) and view an existing release plan
albs products
albs release-plan 39229
# Create a release plan (requires JWT) — never performs the actual release
albs create-release-plan 62316 --platform AlmaLinux-8 --product AlmaLinux
# Release a PARTIAL build (only fully-completed packages):
albs create-release-plan 62316 --platform AlmaLinux-8 --product AlmaLinux \
--whole-packages-only
# View an advisory
albs errata ALSA-2026:A001
# Preview, then create, AlmaLinux advisories: package + CVE(s) + build(s)
# (IDs or URLs). Dates default to today (--issued-date / --updated-date).
albs preview-errata 54743 https://build.almalinux.org/build/54740 54757 \
--package kernel --cve CVE-2026-31431 --cve CVE-2026-43284
albs create-errata 54743 54740 54757 \
--package kernel --cve CVE-2026-31431 --cve CVE-2026-43284
# From an RHSA everything (title, description, CVEs, severity) comes from it:
albs preview-errata 54740 54757 --rhsa RHSA-2026:13566
# Pass token via flag or env var
albs --token "eyJ..." sign-keys
ALBS_JWT_TOKEN="eyJ..." albs sign-keysRun albs --help or albs <command> --help for full usage.
Tools reference
Read-only (no auth)
Tool | Description |
| All platforms and their architectures, fetched dynamically from ALBS |
| Build summary: every task with status, arch, package, git ref, log count, plus Secure Boot state, flavors and any linked builds |
| Only failed tasks with their log files listed; key logs marked with ★ |
| All log/config files available for a build on the server |
| Download a log file to local disk ( |
| Start here on a failure: grep a log for the build-failure signatures (or your own regex) and get every hit with line numbers and context; auto-downloads if needed |
| Read a page of a log from the end, and page upward from there ( |
| Read a specific line range from a log (e.g. around a |
| Browse builds by page, filter by package name or running status — shows each package as an NVR plus the build's release state; a |
| Status of a build's sign tasks (idle/in_progress/completed/failed) — use after |
| List all products (release targets): ID, name, official/community, platforms |
| View an existing release: status, source packages, target repositories |
| View an advisory: title, severity, release status, dates, module, references, packages, builds, description |
| Show the advisories |
Authenticated (JWT required)
Tool | Description |
| List sign keys: ID, name, GPG keyid, active status, platform mappings |
| Create a build: packages or custom Git URLs + platform(s) + branch/tag/srpm, with all mock options |
| Create a sign task for a build with a chosen key |
| Create a scheduled release plan for a build + platform + product. Never performs the actual release — only the plan |
| Create AlmaLinux advisories ( |
| Blocked — performing the actual release is disabled; only plans are supported |
| Blocked — disabled for safety |
Prompts
MCP prompts are user-invoked workflow entry points. In clients like Claude Code they appear as slash commands (/mcp__albs__<name>); the user triggers them, not the agent.
Prompt | Arguments | Description |
|
| Seeds the build-failure investigation workflow for a build ID. Equivalent to asking "why did build N fail?", but as a one-step parameterized command. |
|
| Seeds the release-plan workflow for a build ID (confirm platform, pick product, create the plan). Never performs the actual release. |
|
| Seeds the errata workflow for CVE(s)/an RHSA, build(s) and the package: preview, confirm, create, verify. |
Example (Claude Code):
/mcp__albs__investigate_build 52679
/mcp__albs__release_plan 52679
/mcp__albs__new_errata "CVE-2026-31431 CVE-2026-43284" "54743 54740 54757" kernelinvestigate_build expands into the investigation workflow (get_build_info → get_failed_tasks → download/read the key logs in order), parameterized by the build ID. release_plan expands into the release-plan workflow (get_build_info → get_products → create_release_plan), and explicitly stops at the plan — it never commits/publishes. new_errata expands into the errata workflow (preview_errata → confirm → create_errata → get_errata).
Example: investigating a failed build
Ask the agent: "What went wrong in build 52679?"
The agent will:
get_build_info(70368)— sees that only the i686 task failed; the other 7 arches builtget_failed_tasks(70368)— gets the log files, ★ marks the important onessearch_log(70368, "mock_build.441500.1785274367.log")— greps the 936-line / 600 KB log and returns the cause with context, in one call:>>> 826 | usr/lib/common/mech_openssl.c:2766:52: error: passing argument 5 of 'EVP_PKEY_get_octet_string_param' from incompatible pointer type 833 | note: expected 'size_t *' {aka 'unsigned int *'} but argument is of type 'CK_ULONG *' {aka 'long unsigned int *'} >>> 853 | make[1]: *** [Makefile:9851: ...mech_openssl.lo] Error 1search_log(70368, "mock_root.441500.1785274367.log")— no matches: the chroot and dependencies were fine, so this is not a dependency failureReports: "
CK_ULONG *isunsigned long *while OpenSSL wantssize_t *; on ILP32 (i686) those are different types, so the 3.27.0 rebase only breaks on 32-bit."
Had the search come up empty, the next move is read_log_tail and then the
↑ earlier: ... call it prints, walking the log upward a page at a time. Pages are
sized by the character budget, not a line count — 165 lines of this mock_build, or
350 of the same build's mock_root — and each one starts exactly where the previous
stopped, so nothing is skipped.
Note what step 3 replaces. read_log_tail on that log returns
make: *** [Makefile:4615: all] Error 2 — the symptom, hundreds of lines below the real
error, because make -j keeps compiling after the first failure. Asking for enough tail to
reach the error instead returns 167 KB of gcc command lines and can exceed the caller's
result-size limit. search_log returns 4 KB with the answer at the top.
Example: creating a build
Ask the agent: "Build bash for AlmaLinux-9 from branch c9s"
The agent will call:
create_build(packages=["bash"], platform="AlmaLinux-9", branch="c9s")For multiple platforms at once:
create_build(packages=["bash"], platforms=["AlmaLinux-8", "AlmaLinux-9"], branch="c9s")For external Git repos (e.g. GitHub), use git_urls:
create_build(git_urls=["https://github.com/ykohut/leapp-data.git"], platform="AlmaLinux-10", branch="devel-ng-0.23.0")Architectures default to each platform's full list. When arch_list is specified with multiple platforms, it is validated against each platform individually.
Example: creating a release plan
Ask the agent: "Create a release plan for build 62316 on AlmaLinux-8."
The agent will:
get_build_info(62316)— confirms the platform and that the build has completed tasksget_products()— lists products so you can pick the target (e.g.AlmaLinux)create_release_plan(build_id=62316, platform="AlmaLinux-8", product="AlmaLinux")— collects the completed build tasks, resolves the platform/product names to IDs, and creates a scheduled planReports the plan (status, source packages, target repositories) and makes clear that nothing was published — it is only a plan
The actual release (committing/publishing the plan) is intentionally not performed. Asking the agent to "release for real" routes to
commit_release, which is blocked and explains that only plans are supported.
Example: creating errata
Ask the agent: "Make an advisory for kernel, CVE-2026-31431, builds https://build.almalinux.org/build/54743, 54740 and 54757."
You give only the package (or module), the CVEs — or one RHSA — and the builds. The agent will:
preview_errata(builds=[...], cves=["CVE-2026-31431"], package="kernel")— shows, without creating anything:Issued: 2026-10-23 Updated: 2026-10-23 ALSA-2026:A011 AlmaLinux-8 build #54743 Title: kernel security update (ALBS shows "Important: kernel security update") Module: none Source packages: kernel Packages: 94 RPM(s) (aarch64, i686, noarch, ppc64le, s390x, x86_64) Description: package text from ALSA-2026:87375 + CVE fix list ALSA-2026:A012 AlmaLinux-10 builds #54740, #54757 ... Packages: 272 RPM(s) (aarch64, noarch, ppc64le, s390x, x86_64, x86_64_v2) References: CVE-2026-31431 Important CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H CWE-1288 ... bugzilla 2460538 https://bugzilla.redhat.com/show_bug.cgi?id=2460538 Description: The kernel packages contain the Linux kernel, the core of any Linux operating system. Security Fix(es): * kernel: crypto: algif_aead - Revert to operating out-of-place (CVE-2026-31431) For more details about the security issue(s), ...54740 failed on aarch64 and 54757 is its retry, so both go into one AlmaLinux-10 advisory. Every failed or cancelled build task is always reported — in the preview, in the
create_errataresult and in error messages — even when a retry build covers it or the package is left out:!!! 1 build task(s) FAILED or were CANCELLED — each is listed below as `! ...`. Tell the user about every one. ! FAILED: build #54740 kernel aarch64 (task 411949) — rebuilt in build #54757; packages taken from thereWithout 54757 the same line ends with
— its packages are NOT in the advisory (add the retry build to include them).Asks you to confirm, then
create_errata(...)with the same arguments — it re-reads the latestALSA-2026:A###right before creating, so the IDs are always the next free onesget_errata("ALSA-2026:A011")— confirms ALBS stored it (ALBS creates advisories in the background)
How each field is filled:
Field | Source |
ID |
|
Dates | Today (issued = updated), unless |
Severity | Red Hat: the CVE's threat severity (the highest one for several CVEs) or the RHSA's aggregate severity |
Title |
|
Description | CVEs: the package text from the newest earlier security advisory for the package (same platform first, then any; another stream of the module if needed) + a |
CVE information, References | Each CVE (Red Hat CVE page, with CVSS v3, CWE, impact, public date) and its Red Hat bugzilla |
Module |
|
Packages | Binary RPMs of the named package (or module) from the build(s) — no src/debuginfo/debugsource, other packages in the build left out. Without |
The preview adds a NOTE when Red Hat does not tie one of the given CVEs to the package (usually a wrong CVE ID) or when no earlier advisory has a package text to reuse.
Duplicates. The preview looks up existing advisories on the same platform that already reference the CVEs. One for the same package (same module stream, or same source RPM) is a duplicate — typically the ALSA imported from the RHSA that this build is a plain rebuild of:
!! DUPLICATE: ALSA-2026:87073 "Important: php:8.2 security update" already covers CVE-2026-109618, CVE-2026-109619 for php:8.2 on AlmaLinux-8create_errata then creates nothing unless force=True (albs create-errata --force). The same CVE in another package's advisory (kernel vs kernel-rt, php:7.4 vs php:8.2) is only a NOTE.
Tests
pip install -e ".[test]"
# Unit tests (no network, 347 tests)
pytest tests/test_client_unit.py tests/test_server_unit.py tests/test_cli_unit.py -v
# Integration tests (hits real ALBS API, read-only, 37 tests)
pytest tests/test_integration.py -v
# All tests
pytest -vEnvironment variables
Variable | Description | Default |
| JWT token for authenticated operations | — |
| Directory for downloaded logs |
|
Available Tools
19 toolscommit_releaseA
Commit (perform) a release. CURRENTLY BLOCKED.
This server only creates release plans. Performing the actual release (publishing packages) is intentionally disabled.
Inputs: release_id (required). Returns: result
create_buildA
Create a new build on ALBS. Requires JWT token.
Platforms and allowed architectures are fetched dynamically from ALBS. Use get_platforms to see available options.
For EPEL builds (SRPMs from dl.fedoraproject.org/pub/epel/), the tool automatically applies EPEL-specific flavors and defaults arch to x86_64_v2.
Args: platform: Target platform (single). Use get_platforms to see available options. platforms: List of target platforms to build on (e.g. ["AlmaLinux-8", "AlmaLinux-9"]). Can be used alone or combined with platform. At least one must be provided. packages: List of package names (for git/branch) or SRPM URLs (for from_srpm). For from_tag: use "pkg_name tag_name" format or just "tag_name". At least one of packages or git_urls must be provided. git_urls: List of custom Git repository URLs to build from (e.g. ["https://github.com/user/repo.git"]). Use for repos outside git.almalinux.org/rpms. The branch parameter sets the git ref. For from_tag, use "url tag_name" format. Cannot be used with from_srpm. branch: Git branch to build from (e.g. "a8", "c9s"). from_tag: Build from git tags instead of branch. from_srpm: Build from source RPM URLs. tags: Explicit tags for each package when from_tag=True (must match packages length). arch_list: Architectures to build. Default: all for the platform (x86_64_v2 for EPEL builds). skip_tests: Disable %check phase by adding --define "__spec_check_template exit 0;" to mock definitions. add_epel_dist: Extract .elN dist suffix from each package name/URL and set it as a per-task mock definition: dist=".elN.alma_altarch". Only works with from_tag or from_srpm. Recommended for EPEL-altarch builds. beta: Enable beta flavor. secureboot: Enable SecureBoot signing. nosecureboot: Override secureboot requirement for SB packages. excludes: Space-separated packages to exclude from mock. definitions: Dict of mock definitions, e.g. {"dist": ".el9"}. linked_builds: Build IDs to link. flavors: Additional flavor names. with_opts: Mock --with options. without_opts: Mock --without options. modules: Modules to enable, e.g. ["nodejs:18"]. independent_tasks: When True, disables the per-platform sequential task chain so packages build independently / in parallel within each platform (the default ALBS behavior chains task N's start on task N-1's completion). Applied to every platform entry in the payload. Default: False.
Inputs: beta, tags, branch, flavors, +18 more. Returns: result
create_release_planA
Create a release PLAN on ALBS. Requires JWT token.
Creates a "scheduled" release and computes which packages go to which repositories. It NEVER performs the actual release — nothing is published. Committing the plan (the real release) is intentionally not supported here.
The completed build tasks are collected automatically; the build must have completed tasks. Platform and product names are validated against ALBS — use get_platforms() and get_products() to see valid names.
Args: build_id: The build to release. platform: Target platform name (e.g. "AlmaLinux-9"). product: Target product name (e.g. "AlmaLinux", "epel-al"). Use get_products() to list available products. build_ids: Optional additional build ids to include in the same plan. whole_packages_only: When True, include only packages whose every architecture task completed (drop half-built packages). Use for a PARTIAL build superseded by a 'retry failed' build. Default: False.
Inputs: product (required), build_id (required), platform (required), build_ids, +1 more. Returns: result
delete_buildA
Delete a build. CURRENTLY BLOCKED.
This operation is intentionally disabled for safety.
Inputs: build_id (required). Returns: result
download_logA
Download a build log file to local filesystem.
The file will be saved to $ALBS_LOG_DIR/<build_id>/ (default: /tmp/albs-logs/<build_id>/). After downloading, use read_log_tail to read the contents.
Inputs: build_id (required), filename (required). Returns: result
get_build_infoA
Get build details: tasks, statuses, packages, architectures.
Returns a summary of the build including each task's status, architecture, package name, and whether it has sign tasks. Also lists any linked builds (their -br repos are mixed into the buildroot), which is needed to accurately reproduce a similar rebuild.
Inputs: build_id (required). Returns: result
get_failed_tasksA
Get failed tasks for a build with their available log files.
Shows only tasks that failed, along with log file names. Key logs for debugging: mock_build, mock_stderr, mock_root.
Inputs: build_id (required). Returns: result
get_flavorsA
List all available platform flavors on ALBS.
Returns flavor names and IDs, useful for verifying correct flavor names before creating builds with the flavors parameter.
Inputs: no named parameters. Returns: result
get_platformsA
Get all available platforms and their supported architectures from ALBS.
Returns the list of platforms with arch_list fetched dynamically from the build system.
Inputs: no named parameters. Returns: result
get_productsA
List all products on ALBS. No authentication required.
Returns each product's id, name, official/community flag, and the platforms it covers. Use this to pick the target product when creating a release plan with create_release_plan.
Inputs: no named parameters. Returns: result
get_release_planA
View an existing release plan. No authentication required.
Returns the release status (scheduled/in_progress/completed/failed/ reverted), product, platform, the source packages it covers, and the target repositories.
Inputs: release_id (required). Returns: result
get_sign_keysA
Get available sign keys from ALBS. Requires JWT token.
Returns key ID, name, keyid (GPG fingerprint short), and associated platform IDs needed for sign_build.
Inputs: no named parameters. Returns: result
get_sign_task_statusA
Get the status of sign tasks for a build.
Use this after sign_build to check whether signing completed or failed. Returns each sign task's ID, status (idle/in_progress/completed/failed), and sign key ID. No authentication required.
Inputs: build_id (required). Returns: result
list_build_logsC
List all available log files for a build from the server.
Shows all log and config files stored in Pulp for this build.
Inputs: build_id (required). Returns: result
read_log_rangeA
Read a specific range of lines from a build log.
Use this to widen the window around a line number that search_log
reported, or to inspect an earlier section. Reads forward from
start_line; a range too large for max_chars stops early and tells you
the call to continue with, so nothing is silently lost.
Each line is clipped to max_line_chars (0 = verbatim). The log is
downloaded automatically if not already on disk — no need to call
download_log first.
Inputs: build_id (required), end_line (required), filename (required), start_line (required), +2 more. Returns: result
read_log_tailA
Read a page of a build log from the end, and page upward from there.
Good for how the build terminated (RPM build errors:, the mock
exception). To FIND a compile error, use search_log — the end of a
make -j log holds only the wrapper error.
One call returns as many lines as fit in max_chars (~10k tokens), up to
lines lines. That budget is what sizes the page: the same budget is about
165 lines of a mock_build log or 350 of a mock_root, so a fixed line count
would be wrong for one of them. The result ends with the exact call for the
page above it — before_line=<first line shown> — so walking a log bottom
to top needs no arithmetic and skips nothing.
before_line=N reads the page ending at line N-1. Each line is clipped to
max_line_chars (0 = verbatim); keep the clip on, mock_build lines can be
several KB of gcc flags. The log is downloaded automatically if not already
on disk — no need to call download_log first.
Inputs: build_id (required), filename (required), lines, max_chars, +2 more. Returns: result
search_buildsA
Search builds on ALBS. Returns a page of builds.
Each build line carries its task count, failed count, and release state,
then the packages as full NVRs (mingw-glib2-2.89.2-1.el10) so a version
question can be answered without opening the build. When project is set,
the packages that matched it are listed on their own match: line — the
remaining ones are summarised and may be truncated.
Args: page: Page number (default 1). project: Filter by project/package name. is_running: Filter by running status.
Inputs: page, project, is_running. Returns: result
search_logA
Find the failure in a build log: grep it and return each hit with context.
START HERE when investigating a failed build — do not read tails first.
In a parallel make -j log the real compile error sits hundreds of lines
above the end, so the tail shows only make: *** Error 2: the symptom, not
the cause. This finds the cause in one call.
pattern is a Python regex; omit it to use the built-in build-failure
signatures (compiler/link errors, failed patch hunks, unresolved
BuildRequires, RPM packaging errors, %check failures, OOM/network trouble).
Matched lines are prefixed >>> and every line is numbered, so a hit's
number can be fed straight to read_log_range to see more.
Only the first max_matches hits are reported — the first error is the root
cause and the rest are cascades — but the header counts all of them. Lines
are clipped to max_line_chars around the match (0 = verbatim, needed when
quoting an exact multi-KB command line). The log is downloaded
automatically if not already on disk.
Inputs: build_id (required), filename (required), after, before, +4 more. Returns: result
sign_buildA
Sign a build on ALBS. Requires JWT token.
Use get_sign_keys to see available sign key IDs.
Args: build_id: The build ID to sign. sign_key_id: Sign key ID (default: 4). Use get_sign_keys to list.
Inputs: build_id (required), sign_key_id. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Each tool targets a distinct resource or action: get_* tools each fetch a specific entity (products, platforms, keys, flavors, release plans, build info), and log tools (download, search, tail, range) have clearly separated purposes. Even the two potentially overlapping tools (get_build_info vs get_failed_tasks) are distinct—one gives an overview, the other focuses specifically on failures. No two tools could be confused.
All tool names follow a consistent verb_noun snake_case pattern (e.g., get_build_info, create_build, read_log_tail, search_builds). Verbs are descriptive and nouns reference the subject clearly. There are no mixed conventions or vague names like 'process' or 'do_thing'.
At 19 tools, the server is on the heavier side but each tool serves a clear function within the build system domain. The count is justified by the breadth of operations (create/build, sign, release planning, log inspection, search). It does not feel bloated, though it is slightly above the typical 'sweet spot' of 10-15 tools.
The tool surface covers the full build lifecycle: creation, status retrieval, signing, failed-task inspection, log analysis, release plan creation, and search. Log tools are particularly thorough (search, tail, range, list). The only missing operation—commit_release—is explicitly blocked for safety, not an oversight. There are no dead ends; every workflow has the necessary supporting tools.
Maintenance
Related MCP Connectors
MCP server that lets your AI assistant build and deploy apps, hosting each one at a live URL.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server and CLI for iOS development — build, test, automate, and diagnose from any AI agent or terminal.2MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for intelligent Linux kernel configuration management and building. Enables AI assistants to generate, manage, and optimize kernel configurations and build kernels with comprehensive error detection.7GPL 2.0

evergreen-mcp-serverofficial
FlicenseAqualityCmaintenanceMCP server for MongoDB's Evergreen CI/CD platform, enabling AI assistants to manage projects, analyze builds, and troubleshoot failures via natural language.83-- AlicenseAqualityDmaintenanceMCP server that bridges AI assistants with the SUSE Linux ecosystem, enabling safe access to openSUSE Wiki, OBS, and repositories for system management.221GPL 3.0