Skip to main content
Glama
Jenkins MCP Server

Jenkins MCP Server

by TelmanH

Jenkins MCP Server

Read-only, multi-instance Jenkins access for AI assistants: VS Code GitHub Copilot (Agent mode) at work, Claude Code for local testing, or any other MCP client. Large build logs are analysed on the server; the model only receives small, relevant excerpts. A team knowledge base remembers solved problems, so the next analysis starts from what the team already knows.

Two ways to run it

Company use

Local testing / development

Who

everyone who analyses builds at work

developers of this server

Platform

Windows

macOS or Windows

AI client

VS Code GitHub Copilot (Agent mode)

Claude Code (macOS) or VS Code Copilot (Windows)

Jenkins

your company Jenkins

a test Jenkins in Docker (or any reachable one)

Setup

setup\windows\setup.ps1

tests/macos/setup.sh or setup\windows\setup.ps1 -Dev

Step-by-step guide

setup/windows/README.md

tests/README.md

Client config

.vscode/mcp.json, generated by setup.ps1 (token prompts, VS Code secure storage)

macOS: registered by the script (claude mcp add); Windows: .vscode/mcp.json

The server code is the same in both cases. Day-to-day usage: docs/USER_GUIDE.md.

Related MCP server: hunch

Read-only guarantee

The server cannot change anything in Jenkins:

  • Its HTTP session (ReadOnlySession in src/jenkins_mcp/client.py) refuses every method except GET and HEAD before a request leaves the process. A tool that tried to trigger, stop, delete or configure something would fail with "this MCP server is read-only".

  • Credentials are only sent to the configured Jenkins URLs; URLs of other hosts are refused.

  • Every tool that talks to Jenkins is marked readOnlyHint for the AI client. Only draft_kb_entry and propose_kb_update write: one new local file in knowledge/drafts/ each time (never overwrites, never Jenkins), so they are honestly marked as local writes.

  • The only other local writes are the log cache (~/.cache/jenkins-mcp, owner-only permissions).

  • Tested: offline (no non-GET request is ever sent, POST/PUT/PATCH/DELETE blocked) and live against a real Jenkins (all build numbers unchanged after running every tool).

Project layout

jenkins-mcp/
├── src/jenkins_mcp/        SERVER CODE (same on Windows and macOS, installed with pip)
├── config/                 YOUR SETTINGS: *.example templates committed; your yaml/.env are git-ignored
├── knowledge/              TEAM DATA: known issues (Markdown); may also live in its own repo
├── docs/USER_GUIDE.md      how to use it day to day
│
├── setup/windows/          COMPANY: Windows + VS Code Copilot
│   ├── setup.ps1           install script (-Dev: + test tools, for developers)
│   └── README.md           step-by-step guide
├── .vscode/                VS Code: mcp.json = Copilot server (generated, git-ignored; template mcp.example.json),
│                           settings.json = pytest
│
└── tests/                  LOCAL TESTING / DEVELOPMENT (never installed)
    ├── README.md           step-by-step guide: macOS + Claude Code, Windows + VS Code
    ├── macos/setup.sh      macOS: install + Claude Code registration + offline tests
    ├── test_*.py           offline tests (pytest, fake Jenkins)
    ├── fixtures/           sample log + example knowledge base for the tests
    └── live/               real Jenkins in Docker + live check of every tool (run_live.sh / run_live.ps1)

Source package:

src/jenkins_mcp/
├── app.py          FastMCP object, server instructions, shared parameter types
├── main.py         imports tools + prompts, run()  (command: jenkins-mcp)
├── vscode_config.py  writes .vscode/mcp.json (token prompts per instance), called by setup.ps1
├── xmlutil.py      Jenkins XML 1.1 parsing
├── settings.py     paths (JENKINS_MCP_HOME), env tunables
├── config.py       config/jenkins_instances.yaml + config/.env -> Settings, validation, instance lookup
├── client.py       ReadOnlySession (GET/HEAD only), Instance
├── targets.py      job/build/URL resolution
├── text.py         secret masking, output budget, formatting
├── rules/          built-in error/ignore/noise rules (YAML)
├── logs/           download + cache, cleaning, stage detection, error grouping
├── kb/             knowledge base: load entries, match against logs
├── tools/          MCP tools: instances, jobs, builds, logs, artifacts, infra, knowledge
└── prompts.py      analyse_build, document_session

Configuration

Files (templates in config/, your copies are git-ignored):

File

Content

config/jenkins_instances.yaml

Jenkins instances, TLS, log rules, knowledge base folder (template: jenkins_instances.example.yaml)

config/.env

Credentials, one pair per instance (template: .env.example)

Environment variables (set them in config/.env, in the MCP client config, or in the shell):

Variable

Default

Purpose

JENKINS_<NAME>_USER / JENKINS_<NAME>_TOKEN

-

Credentials of instance <name> (upper case, non-alphanumeric -> _). Other names: user_env / token_env in the yaml

JENKINS_MCP_HOME

nearest parent of the working dir with config/jenkins_instances(.example).yaml

Project folder with config/ and knowledge/

JENKINS_MCP_CONFIG

<home>/config/jenkins_instances.yaml

Instance file

JENKINS_MCP_KB_DIR

knowledge.dir in the yaml, else <home>/knowledge

Knowledge base folder (e.g. a private team repo)

JENKINS_MCP_CACHE_DIR

~/.cache/jenkins-mcp

Log cache (contains raw console logs)

JENKINS_MCP_CACHE_MAX_MB

1024

Cache size limit

JENKINS_MCP_MAX_LOG_MB

200

Larger logs keep the first 20 % and the end

JENKINS_MCP_MAX_CHARS

12000

Hard size limit of one tool answer

JENKINS_MCP_JOB_CACHE_S

60

Job lists (list_jobs, overviews) are reused for this long; 0 = off

JENKINS_MCP_LOG_LEVEL

WARNING

Server log level (stderr)

After editing the yaml or .env, call list_instances(reload_config=true); no restart is needed. Config problems are reported by list_instances under config_errors.

Use a dedicated Jenkins user with read permissions only (Overall/Read, Job/Read) for the API token. The server never writes to Jenkins, but a read-only account limits the damage if a token leaks.

Tools (34)

Tool

Purpose

list_instances

instances, token source, connection check (version, user/groups, admin rights, quiet-down), config errors, knowledge base state; reload_config

list_jobs

recursive job list with status/folder/name filter; failing jobs show the last green build

failures_overview

red/yellow jobs in the last N hours across all instances, with the last green build

recent_builds

every build in the last N hours across all instances: result, culprits, long-running builds

get_job

job details, permalinks, recent builds, parameters, children

find_jobs_by_scm

which jobs build a repository (or load a Shared Library), across instances; any URL spelling

get_build_summary

start here: result, params, agent, culprits, downstream builds, pending input, stages, failed stage, known issues, root-cause candidates, tail

get_stage_log

errors and tail of one stage (default: failed stage); exact = per-step log via wfapi (parallel branches)

get_pending_inputs

what a running build waits for (input step); approving stays in the UI

get_log_errors

de-duplicated error groups, annotated by the knowledge base

search_log / get_log_lines

regex search with context / line windows

get_test_failures

failed JUnit cases incl. how long they fail

get_pipeline_info

what actually ran: Jenkinsfile source, git checkouts, Shared Library versions (hint on LF-version mismatch), replay, slowest steps; show_script = executed Jenkinsfile

compare_builds

good vs bad: agent, params, stages, commits (Jenkinsfile/groovy changes flagged), new errors, errors also in good build, env.log diff; pick builds by node (good_on_node/bad_on_node) or take the good build from another instance (other_instance)

get_job_config

config.xml as a summary: SCM, Jenkinsfile path, parameters, triggers, retention, label, build steps, Config File Provider files, credential IDs; raw = masked XML

read_managed_file

content of a Config File Provider file (settings.xml...), secrets masked

get_job_config_history, diff_job_config

who changed the job config and when (Job Config History plugin); semantic + XML diff of two versions or against the live config

list_artifacts, read_artifact, get_env_log

artifact list (sizes, download URL), text artifacts (UTF-8, UTF-16, cp1252), secrets masked

compare_artifacts

artifacts of two builds: added/removed, changed (fingerprint, size, bytes); diff of one text artifact, checksum of a binary

list_workspace, read_workspace_file

files that were not archived, from the job / Pipeline node-block workspace (current state on the agent)

node_health, get_queue

agents (labels, disk, memory, offline reason, clock) and queue

get_node

one node: labels, which build runs on which executor, Java version, config.xml (remote root, launcher, node env vars masked, tool locations)

find_known_issues

match a build or a pasted error text against the knowledge base

get_known_issue, list_known_issues

read / list entries, with how often each matched since the server started

draft_kb_entry

write a new local draft in knowledge/drafts/ (local write, never Jenkins)

propose_kb_update

propose an update of an existing entry (new build, extra regexes) as a new draft next to it (local write)

recurring_errors

errors across the newest builds of a job: regression ("new since #N") vs. also in green builds

Prompts: analyse_build, document_session, morning_report (Copilot: type / and pick mcp.jenkins...; Claude Code: /mcp__jenkins__analyse_build).

All tools are read-only towards Jenkins; see Read-only guarantee.

Knowledge base workflow

  1. Analyse a build. get_build_summary shows known_issues if an entry matches.

  2. When the cause is found and confirmed, run the prompt document_session (or ask the agent). It checks for duplicates and calls draft_kb_entry, or propose_kb_update when an entry already exists. recurring_errors finds red-herring candidates (errors that also occur in green builds).

  3. Review the draft in knowledge/drafts/, move it to knowledge/, commit it to your team's private knowledge repo. The server picks up file changes automatically.

Company knowledge does not belong in this public repository: .gitignore excludes knowledge/KB-*.md and drafts. Keep entries in a private repo and point JENKINS_MCP_KB_DIR (or knowledge.dir) at its checkout.

Format and field reference: knowledge/README.md. Start new entries from knowledge/TEMPLATE.md.

Development

See tests/README.md. Adding a tool: write a function with @mcp.tool(annotations=READ_ONLY) in a module under src/jenkins_mcp/tools/ (for a new module also import it in tools/__init__.py), and add a test to tests/test_tools.py.

Notes and limits

  • Multibranch branch names containing / are addressed with %2F (as list_jobs shows them).

  • Stage line ranges come from console markers; output of parallel branches can interleave (get_stage_log exact=true reads the stage step by step from wfapi instead).

  • Builds still running are not cached on disk; their log is fetched incrementally (only the new part).

  • Downstream builds are recognised from the console line Starting building: <display name> #N. If a job has a custom display name, it cannot be resolved by that name, and the summary says so.

  • Logs larger than JENKINS_MCP_MAX_LOG_MB keep the first 20 % and the end.

  • Log content is untrusted: a log line can contain text that looks like an instruction. The server cannot change Jenkins, so such text cannot trigger actions through it.

Security

See SECURITY.md for the threat model and how to report a vulnerability.

License

MIT © 2026 Telman Huseynli

Roadmap

  • Release 1.1.0: the live Docker test (Jenkins 2.580.1) and a manual Windows / VS Code Copilot run against real instances passed. Set the package status back to 5 - Production/Stable, turn Unreleased in CHANGELOG.md into 1.1.0, tag v1.1.0 and publish a GitHub release.

  • Replace the module-level singletons (config, knowledge base cache, log LRU, job tree cache) with one application context object, and pass log rules into logs/ instead of reading the global config there.

  • CI pipeline on Windows: ruff, mypy, pytest.

  • Read-only plugin tools: installed plugins and versions, plugins with problems (missing dependencies), available updates. /pluginManager/api/json?depth=1 usually needs Overall/SystemRead or Administer: check it with a normal user's token first; without that permission the tools would only return 403.

  • More read tools: views, node env/PATH (system info, needs admin), Jenkinsfile and JCasC history from Git (Bitbucket).

  • Optional HTTP transport for one shared team server (needs authentication / a gateway).

  • Human-in-the-loop write actions (not implemented): plan_* tool -> one-time token -> human confirms -> execute_plan with a separate service account and an allow-list.

Available Tools

34 tools
compare_artifactsCompare ArtifactsA
Read-onlyIdempotent

Compare the archived artifacts of two builds. Without path: artifacts only in one build, and which common ones changed (by Jenkins fingerprint, else by size, small files byte-wise). With path: a unified diff of a text artifact (secrets masked), or the sha256/size of a binary one.

Inputs: job (required), bad, good, path, +1 more. Returns: object

compare_buildsCompare BuildsA
Read-onlyIdempotent

What changed between a good and a bad build: result, duration, agent node, parameters, stage status/durations, commits in between (pipeline_changes = commits touching a Jenkinsfile or *.groovy), error groups that are new in the bad build, and env.log differences (if both builds archived env.log). Ideal for 'it worked yesterday', 'why is node A slower than node B' and for checking whether an error also occurs in green builds. good_on_node / bad_on_node pick builds by agent ('works on agent-01, fails on agent-03'; Pipeline jobs need up to 10 log reads); other_instance compares the same job across instances (no commit range).

Inputs: job (required), bad, good, instance, +3 more. Returns: object

diff_job_configDiff Job ConfigA
Read-onlyIdempotent

What changed between two configuration versions of a job: a semantic list ('triggers: cron: H 3 * * * -> cron: H 2 * * *', parameters, SCM, script path, retention...) plus a unified diff of the XML. Secrets are masked in both. Default: the newest version against the one before it.

Inputs: job (required), newer, older, instance. Returns: object

draft_kb_entryDraft Kb EntryA

Write a NEW knowledge base draft (Markdown) to knowledge/drafts/ for human review. Call this at the end of a debugging session once the user confirmed the root cause. It never touches Jenkins and never overwrites a file. Drafts are not used for matching until a human reviews them and moves them into knowledge/ (then commit to Git).

Inputs: match (required), title (required), root_cause (required), job, +11 more. Returns: object

failures_overviewFailures OverviewA
Read-onlyIdempotent

Jobs whose LAST build failed (and optionally is unstable) within the last hours, across one or all instances in parallel. Good for a morning check or 'what is red right now'.

Inputs: hours, folder, instance, include_unstable, +1 more. Returns: object

find_jobs_by_scmFind Jobs By ScmA
Read-onlyIdempotent

Jobs whose last build checked out a repository (app repo or Shared Library), across instances: 'job | STATUS #n | repo URL'. URL spellings are normalized (https / ssh / port / Bitbucket /scm/ / .git). ~1 request per instance. Jobs that were never built cannot be found this way.

Inputs: url (required), folder, instance. Returns: object

find_known_issuesFind Known IssuesA
Read-onlyIdempotent

Look up the team knowledge base. With job (+build) the build log is matched against every entry in scope (instance/job); with text, a pasted error message is matched. Returns matching entries with the first matching log line and the documented fix. get_build_summary already does this automatically - use this tool for a pasted error or before writing a new entry.

Inputs: job, text, build, instance, +1 more. Returns: object

get_build_summaryGet Build SummaryA
Read-onlyIdempotent

START HERE for any build question. Compact summary of one build: result, duration, trigger, parameters, agent node, commits, culprits (failed builds), downstream builds started by the build step (with their result), pending input steps (running builds), stages (with failed stage and its error), test counts, log size, known issues from the team knowledge base, likely root-cause error lines with line numbers, and the last meaningful log lines. Typical size: 1-3k tokens even for 30k+ line logs.

Inputs: job (required), build, instance. Returns: object

get_env_logGet Env LogA
Read-onlyIdempotent

The env.log artifact (environment variables dumped by the pipeline) of a build, with secret-looking values masked. Optional regex pattern filters the lines (e.g. 'JAVA|MAVEN|NODE').

Inputs: job (required), build, pattern, instance. Returns: result

get_jobGet JobA
Read-onlyIdempotent

Job details: type, health, permalinks (last/lastFailed/lastSuccessful build numbers), recent builds, parameters it accepts, and children if it is a folder/multibranch project.

Inputs: job (required), instance, recent_builds. Returns: object

get_job_configGet Job ConfigA
Read-onlyIdempotent

A job's (or folder's) configuration from config.xml as a compact summary: type, SCM repo/branches, Jenkinsfile path or inline script, parameters, triggers (cron, SCM polling, upstream), build retention, concurrency, label, freestyle build steps, Config File Provider files (managed_files), folder Shared Libraries and the credential IDs used (IDs only, never values). Needs Job/ExtendedRead. Jobs managed by JCasC/JobDSL: this is the live state; the source of truth is in Git.

Inputs: job (required), raw, instance. Returns: object

get_job_config_historyGet Job Config HistoryA
Read-onlyIdempotent

Who changed a job's configuration and when (Job Config History plugin), newest first: 'timestamp | operation | user'. Use the timestamps with diff_job_config. Changes by SYSTEM usually come from JCasC / JobDSL seed jobs: then the source of truth is Git and UI changes get overwritten.

Inputs: job (required), limit, instance. Returns: object

get_known_issueGet Known IssueA
Read-onlyIdempotent

Full text of one knowledge base entry: scope, symptoms, root cause, fix, how it was found, red herrings. Content is written by the team (reviewed) - drafts are marked as unreviewed.

Inputs: id (required). Returns: result

get_log_errorsGet Log ErrorsA
Read-onlyIdempotent

All detected error lines of a build, de-duplicated into groups (same message = one group with a count), in order of first appearance, with line number, stage, severity and a shortened stack trace. Severity 'warn' = error text inside a line logged as WARN (often retries, rarely the cause); category 'generic' = an 'Error:'/'FATAL:' line no specific rule knows (ranked after specific errors). Groups the knowledge base knows are annotated ('known issue', 'known noise', 'consequence of'). Generic Jenkins wrapper messages ('script returned exit code 1') are hidden unless include_generic.

Inputs: job (required), build, category, instance, +2 more. Returns: result

get_log_linesGet Log LinesC
Read-onlyIdempotent

A window of the cleaned console log with line numbers (max 400 lines per call). Use line numbers from the other tools. hide_noise drops [Pipeline]/download/progress lines.

Inputs: job (required), build, count, start, +2 more. Returns: result

get_nodeGet NodeA
Read-onlyIdempotent

One node in detail. Live: online/offline (reason), labels, every executor with the build running on it, Java version (if a monitor exposes it), disk/memory/clock. Configuration (config.xml): remote root, mode (any job / matching labels only), launch method (e.g. SSH host), node environment variables (secrets masked) and tool locations. Without Computer/ExtendedRead permission only the live part is shown.

Inputs: name (required), instance. Returns: object

get_pending_inputsGet Pending InputsA
Read-onlyIdempotent

What a running Pipeline build is waiting for (input steps): message, id, button, requested inputs and who may approve. Read only - approving or aborting stays a human action in the Jenkins UI.

Inputs: job (required), build, instance. Returns: object

get_pipeline_infoGet Pipeline InfoA
Read-onlyIdempotent

What actually ran in a Pipeline build: where the Jenkinsfile came from, the git checkouts (repo, branch, commit), the Shared Library versions that were loaded (with a hint when a library branch does not match a VERSION parameter, e.g. rel-2.3 vs REL_VERSION=2.4), replay / restart-from-stage, and the slowest steps, and the Config File Provider files it provisioned. show_script=True adds the executed script (needs the Run/Replay permission).

Inputs: job (required), build, instance, show_script. Returns: object

get_queueGet QueueA
Read-onlyIdempotent

Build queue: what is waiting, for how long, and why (e.g. 'Waiting for next available executor on label X'). Stuck items are flagged. Useful when builds 'hang' before starting.

Inputs: limit, instance. Returns: object

get_stage_logGet Stage LogA
Read-onlyIdempotent

Errors and the last meaningful lines of ONE pipeline stage (default: the failed stage). Much cheaper than the full log. Lines of parallel branches can interleave in the console; exact=True reads the stage step by step from wfapi instead (falls back to the console without the plugin).

Inputs: job (required), build, exact, stage, +2 more. Returns: result

get_test_failuresGet Test FailuresA
Read-onlyIdempotent

Failed test cases from the JUnit test report (not the log): class, test, error message, shortened stack, and 'age' = number of consecutive builds this test has been failing.

Inputs: job (required), build, instance, max_cases. Returns: object

list_artifactsList ArtifactsA
Read-onlyIdempotent

Archived artifacts of a build (relative paths, optionally with sizes) and the download base URL. Read text artifacts with read_artifact; binaries (jar, zip, pdf, xlsx...) are never sent to the model - use the download URL.

Inputs: job (required), build, limit, sizes, +1 more. Returns: object

list_instancesList InstancesA
Read-onlyIdempotent

List configured Jenkins instances (name, url, description, default, where the token comes from). check_connection=True also pings each instance and reports the Jenkins version or the error, the token's user and groups, whether it has admin rights, and quiet-down (shutdown) mode. reload_config=True re-reads config/jenkins_instances.yaml and config/.env without restarting the server. Also reports configuration problems and the state of the knowledge base.

Inputs: reload_config, check_connection. Returns: object

list_jobsList JobsA
Read-onlyIdempotent

List jobs recursively (folders and multibranch projects are expanded). folder: start below this folder, e.g. 'cd' or 'release'. Empty = whole instance. status: comma list filter on the last build: SUCCESS, FAILURE, UNSTABLE, ABORTED, NOT_BUILT, BUILDING, DISABLED. name_contains: case-insensitive substring filter on the full job name. Each row: 'full/job/name | STATUS #lastBuild | age'. Uses few API calls (no per-job requests).

Inputs: limit, folder, status, instance, +1 more. Returns: object

list_known_issuesList Known IssuesB
Read-onlyIdempotent

List knowledge base entries: 'id | status | category | scope | title', plus how many builds each entry matched since the server started. query = case-insensitive text filter on title and content.

Inputs: query, category, instance, include_drafts. Returns: object

list_workspaceList WorkspaceA
Read-onlyIdempotent

Files in a job's workspace (folders end with '/'), for files that were not archived (e.g. app-queue.log). Pipeline: the workspace of a node block of the build; with several blocks it lists them first. Shows the CURRENT state on the agent. Needs the Job/Workspace permission and a reachable agent.

Inputs: job (required), path, build, node_id, +1 more. Returns: object

node_healthNode HealthA
Read-onlyIdempotent

Controller and agent status: online/offline (with reason), labels, executors, idle, free disk and temp space, free memory/swap, response time, clock drift, plus warnings. Static agents only; ephemeral Kubernetes agents appear only while they exist. Details of one node: get_node.

Inputs: instance, only_problems. Returns: object

propose_kb_updatePropose Kb UpdateA

Propose an update of an EXISTING knowledge base entry instead of writing a duplicate: writes a NEW draft next to it in knowledge/drafts/ with the build URL added to builds, the extra regexes merged in and an 'Update proposal' section. Never touches the entry itself or Jenkins, never overwrites a file. Reports whether the entry matches the given build.

Inputs: id (required), job, note, build, +4 more. Returns: object

read_artifactRead ArtifactA
Read-onlyIdempotent

Read a text artifact (reports, logs, yaml, json...). With pattern it greps (regex, case-insensitive, 1 line context, max 50 matches); otherwise returns count lines from start (0 = tail). Secrets are masked. UTF-8, UTF-16 (with BOM) and cp1252 files are decoded; binary files are refused.

Inputs: job (required), path (required), build, count, +3 more. Returns: result

read_managed_fileRead Managed FileA
Read-onlyIdempotent

Content of a Config File Provider managed file (settings.xml, .npmrc, properties...) with secrets masked. Global files by default; pass folder= for files defined in a folder.

Inputs: id (required), folder, instance. Returns: result

read_workspace_fileRead Workspace FileA
Read-onlyIdempotent

Read a text file from a job's workspace (e.g. a log the build did not archive). With pattern it greps (regex, case-insensitive); otherwise count lines from start (0 = tail). UTF-8, UTF-16 and cp1252 are decoded, binary files refused, secrets masked. Shows the CURRENT file on the agent.

Inputs: job (required), path (required), build, count, +4 more. Returns: result

recent_buildsRecent BuildsA
Read-onlyIdempotent

Every build (not only the last one per job) started in the last hours, across one or all instances in parallel, newest first: 'job #n RESULT duration age | culprits | long-running note'. Counts per result. Uses ~1 request per instance (up to 10 newest builds per job are checked). Good for 'what ran/failed today', a morning check or a stand-up.

Inputs: hours, folder, status, instance, +1 more. Returns: object

recurring_errorsRecurring ErrorsA
Read-onlyIdempotent

Error groups across the newest finished builds of one job (max 20): in how many failed and green builds each occurs, first/last build, and a verdict - 'new since #N' (regression) or 'also in green builds' (red_herring candidate for the knowledge base). Knowledge base notes are attached. Cost: one log per build (cached afterwards).

Inputs: job (required), last_n, instance. Returns: object

search_logSearch LogA
Read-onlyIdempotent

grep -C for a build log: matching lines with context lines around them and line numbers. Optionally restricted to one stage. Reports the total number of matches even if only max_matches are shown.

Inputs: job (required), pattern (required), build, stage, +4 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 34 tools

    Disambiguation4/5

    Purpose clusters (log inspection, artifacts, jobs, nodes, knowledge base) are well delineated and descriptions give explicit guidance like 'START HERE' and 'use this instead'. The main risk is the dense family of log tools (get_build_summary, get_log_errors, get_stage_log, search_log, get_log_lines, recurring_errors) where boundaries are clear only after reading the full descriptions.

    Naming Consistency4/5

    Mostly verb_noun snake_case (get_build_summary, list_jobs, compare_builds, read_artifact, find_known_issues). A handful drop the verb (node_health, failures_overview, recent_builds, recurring_errors), which is a minor but noticeable deviation from the otherwise predictable pattern.

    Tool Count3/5

    34 tools is heavy, well above the comfortable 3-15 range. The Jenkins debugging domain is genuinely broad (logs, artifacts, jobs, config, nodes, queue, KB, workspace) and most tools earn their place, but the surface is large enough to burden tool selection.

    Completeness5/5

    Coverage is unusually thorough across builds, logs, artifacts, test failures, job/node/queue state, config history and diffing, knowledge base lifecycle, and workspace reads. The only apparent gap is write/action operations (triggering, aborting, approving inputs), which seem intentionally excluded as a safety choice and are explained as such.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Provides AI assistants with persistent memory of your project architecture, development history, and technical decisions, allowing them to give context-aware coding help without needing repeated explanations.
      16
      61 npm
      2
      MIT
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables AI coding agents to access evidence-backed repository memory, code graph, project DNA, and deterministic change validation so they understand design decisions, past bugs, and invariants while working.
      983 npm
      16
      Functional Source , Version 1.1, ALv2 Future
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables AI agents to analyze, cluster, compare, and export reports from local log files through seven read-only tools, returning compact evidence packs with line-number citations instead of raw log dumps. All processing happens on the local machine, so log data never leaves the environment.
      63 PyPI
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables AI assistants to query application projects directly for logs, metrics, incidents, and semantic search through read-only tools.
      17
      46 npm
      1
      MIT