A local MCP server that exposes a Jenkins REST surface over stdio, enabling Claude and other MCP clients to interact with Jenkins instances for build inspection, job management, and log analysis.
Strong tool naming (all verb-prefixed, clear intent) and comprehensive descriptions (avg 180 chars, well above 34-char baseline). All 17 tools have explicit descriptions and input schemas with typed parameters. However, output schemas are not documented in the visible code, responses are described narratively but not formally specified. Parameter descriptions are present but some lack constraint details (e.g., regex patterns, numeric bounds). Error handling is mentioned in descriptions but not formalized in schema. No tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only.
Union the commits across every completed build since the job's last successful one. Walks previousCompletedBuild from the latest completed build down to (but not including) the last green, skipping aborted/in-progress builds. Dedupes by commitId. Optional path_filter (case-insensitive RE2) narrows by touched path; max_commits caps rendering (default 100). Surfaces an 'all green' message when the latest completed build is the last green, and a warning footer when more than 50 builds sit between greens.
Diff two builds of the same job across result, duration, parameters, SCM commits, pipeline stages, and JUnit tests. Inputs are explicit build numbers (build_a, build_b — lastBuild not accepted). SCM diff is direct (commits in build_b's change set not in build_a's); intermediate builds are not walked. Set include_tests=false to skip the per-test diff on large suites.
Return three labeled sections for a build: Cause (manual/SCM/upstream/timer — Jenkins' shortDescription verbatim), Parameters (name=value; secret-typed values that Jenkins masks render as (masked)), and Injected Env Vars (EnvInject plugin; degrades to a clear 404 hint when the plugin isn't installed). Optional name_filter (case-insensitive RE2) narrows the env-var section only; cause+parameters always render in full.
Get a Jenkins build's status, duration, parameters, and change set.
Output schemas not documented. Tool descriptions explain what is returned narratively (e.g., 'returns build number, finish time, URL') but no formal JSON Schema output specification is visible. LLMs cannot reliably extract fields or plan downstream tool chains without documented response structures.
Missing tool annotations. All 17 tools are read-only (risk=READ_ONLY in metadata), but no readOnlyHint annotation is present in the MCP tool definitions. This prevents clients from optimizing caching, retry logic, or UI presentation for safe operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Fetch Jenkins build console output. Returns last 500 lines by default; pass tail_lines explicitly (negative = full log). The response footer reports the on-disk cache path so the full log can be inspected via Read/Grep/Bash without re-fetching.
Download (if needed) the full console log for a completed build and return its on-disk cache path. Lets you Read/Grep/Bash the full log natively — useful when one test's failure is caused by an earlier test, and you need to see everything that came before.
Parse a Ginkgo `Summarizing N Failure` block from the build's console log and, for each failing spec, return the first [ERROR] line tagged with that spec name plus surrounding context. Ginkgo-specific — returns a hint if the log doesn't look like Ginkgo.
List installed Jenkins plugins with versions via /pluginManager/api/json. Active-only by default (set include_inactive=true to surface disabled/failed plugins). Optional name_filter (case-insensitive RE2 regex) narrows by shortName. Capped at 200 rows. Returns a clear hint when the token lacks admin permission instead of erroring.
Return the per-commit change history for one build: commit id, author, timestamp, message subject, and each commit's touched paths with a single-letter edit code (A/M/D). Pipeline builds may produce multiple change sets (one per checkout step); they are flattened in order with a per-set header. Optional path_filter (case-insensitive RE2) narrows to commits that touch a matching path; max_commits caps rendering (default 50).
Fetch structured JUnit test results from Jenkins' /testReport/api/json. Returns failed cases with className, name, duration
Run a fixed battery of read-only probes against the configured Jenkins and return a one-line-per-check report: reachability, Jenkins version, authenticated user, CSRF crumb issuer, Pipeline/JUnit plugin presence, online/offline node counts, and clock skew. Useful for validating a fresh install or debugging 'the agent says it can't see Jenkins'.
Report the most recent successful build of a job via /<job>/lastSuccessfulBuild/api/json. Renders the build number, finish time (UTC), and URL. Returns a clear hint when the job has never had a successful build. Use as the start point for bisect — pair with changes_since_last_green to see what's landed since.
Enumerate the branches of a Jenkins WorkflowMultiBranchProject with per-branch last-build state (number, result, duration, timestamp). Optional name_filter (case-insensitive RE2) narrows by branch name; healthy_only=true keeps only SUCCESS branches. Returns a hint and points back to list_jobs if job_path isn't a multibranch container.
Enumerate jobs and folders in Jenkins. Pass folder_path to scope the listing (empty = root), recursive=true to walk into sub-folders, and name_filter (case-insensitive RE2 regex) to match leaf names. Use this first when the caller doesn't already know a job_path. Capped at 500 entries — narrow with folder_path or name_filter for large instances.
Regex-search (RE2) a Jenkins build's console log and return matches with surrounding context.
Stream a capped slice of an in-flight build's console via Jenkins' progressiveText endpoint. Echo the footer's Next since_byte back on the follow-up call to advance through the log without re-fetching. Never writes to the on-disk cache — the cache invariant (finished builds only) is preserved. When the build finishes, the footer references get_console_log_path for the cached full log going forward. Defaults: since_byte=0, max_bytes=65536 (cap 1 MB).
Resolve the configured token's effective Read / Build / Cancel / Configure permissions on a job by issuing read-only HTTP probes (every probe is a GET — this tool never POSTs, even with read-only mode off). Use up-front when you're about to trigger or cancel a build to avoid burning a turn on a 403. Each row reports OK / DENIED / UNKNOWN; folders surface build/cancel as N/A, and cancel is N/A when there's no last build.
Incomplete parameter constraints. Parameters like 'tail_lines' (get_console_log), 'max_bytes' (tail_running_build), and 'max_commits' (get_scm_context) lack explicit min/max bounds in schema. Descriptions mention defaults and caps (e.g., '1 MB cap') but JSON Schema does not enforce them, allowing LLMs to pass invalid values.
Minimal descriptions for two tools. 'get_build_info' and 'get_test_report' have descriptions under 50 characters ('Get a Jenkins build's status, duration, parameters, and change set.' and 'Fetch structured JUnit test results from Jenkins' /testReport/api/json. Returns failed cases with className, name, duration'). These lack context on when to use them vs similar tools (e.g., get_build_environment).
No pagination metadata in list tools. 'list_jobs' and 'list_branches' mention caps (500 and implicit limits) but do not document whether responses include total_count, next_cursor, or offset for pagination. LLMs cannot reliably iterate large result sets.