Jenkins MCP Server
Provides tools for managing Jenkins jobs, builds, nodes, queues, and pipelines, including creating, updating, deleting, triggering builds, and retrieving console logs.
Click on "Install 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., "@Jenkins MCP ServerWhat's the status of the last build of the 'my-service' job?"
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.
Jenkins MCP Server
Production-ready Jenkins Model Context Protocol server for Hermes Agent and other MCP clients.
Tools
23 tools, grouped as the guardrail policy groups them.
Group | Tool | Purpose |
|
| List jobs, optionally within a folder |
|
| Job details and recent builds |
|
| Fetch |
|
| Build result, duration, parameters |
|
| Progressive, size-bounded console log |
|
| Builds currently executing |
|
| Inspect the build queue |
|
| List agents |
|
| Agent details |
|
| Create a job from |
|
| Create a Pipeline job |
|
| Create a Git multibranch Pipeline |
|
| Trigger a branch scan |
|
| Copy an existing job |
|
| Enable a job |
|
| Disable a job |
|
| Trigger a build, with parameters |
|
| Overwrite an existing |
|
| Delete a job — irreversible, opt-in |
|
| Stop, terminate, or kill a running build |
|
| Cancel a queued item |
|
| Take an agent offline or online |
|
| Generic Jenkins REST call — disabled by default |
See Security and guardrails for how to restrict these at either layer.
Related MCP server: MCP-Jenkins
Jenkins compatibility
Jenkins | Line | Status | Coverage |
2.555.x | Current LTS | ✅ Verified | Full tool suite, every change |
2.541.3 | LTS | ✅ Verified | Full tool suite |
2.504.3 | LTS 2.504 | ✅ Verified | Full tool suite |
2.504.1 | LTS 2.504 | ✅ Verified | Full tool suite, pinned plugin set |
Other 2.x | — | ⚪ Supported | Not covered by CI |
1.x | — | ❌ Unsupported | Different URL scheme, no folders |
"Verified" means the full end-to-end suite ran against that core in CI: create a
Pipeline job, trigger it, stream the console, stop the build, delete the job,
with all 23 tools reachable. Reproduce any row with
compatibility.yml.
Run the current LTS line where possible: it is the only line receiving security backports.
Requirements
Authentication | Username and API token. Do not use the account password |
Folder paths such as |
|
Pipeline tools, and |
|
Multibranch tools |
|
A missing plugin disables the tools that depend on it. The rest, including all freestyle and node tools, continue to work on a core-only controller.
Known issues
Symptom | Cause | Fix |
Reads succeed, every write returns 403 | Strict Crumb Issuer with check client IP; the crumb is bound to a source address that changes behind SNAT or an egress proxy | Disable the IP check, or exclude the MCP server |
| The account has | Grant |
| Triggered without parameters | Pass |
Plugin, permission, proxy and scale details, and how to verify against your own controller, are in docs/JENKINS_COMPATIBILITY.md.
Capabilities
Native MCP Streamable HTTP endpoint at
/mcpand optional stdio transport.Job list/read/create/update/delete/copy/enable/disable.
Pipeline and Git multibranch Pipeline creation and scanning.
Build trigger, parameterized builds, running-build discovery, stop/terminate/kill.
Queue inspection and cancellation.
Node inspection and optional online/offline management.
Progressive bounded console logs.
Jenkins crumb support, retries, timeouts, nested-folder paths, and TLS verification.
Read-only mode, job allowlist, write-category controls, and JSONL audit logging.
Optional generic administrator REST request, disabled by default.
Published artifacts
ghcr.io/grglzrv/jenkins-mcp-server:<version>
ghcr.io/grglzrv/jenkins-mcp-server:<version>-minibridge
oci://ghcr.io/grglzrv/charts/jenkins-mcp-server --version <version>Release images are published for linux/amd64 and linux/arm64. The plain
image contains only the Python server. The -minibridge tag is a separately
built variant that bundles both executables in one container; Minibridge is not
a sidecar and is not downloaded at pod startup.
Architecture
Requests pass through up to two independent enforcement layers before reaching Jenkins. The server's own policy always applies. The minibridge proxy is optional and adds a second layer in front of it.
Inside minibridge the three settings do different jobs, which is easy to
confuse because they sit side by side in values.yaml:
Setting | Question it answers | Nature |
| Which tools and capabilities may be called at all? | Deterministic, by name |
| Is the content flowing through safe? | Heuristic, pattern matching |
| Which engine evaluates, and does a violation block or only log? | Engine configuration |
minibridge is the component; guardrails is one key inside it. With
minibridge.enabled: false the guardrails list does nothing, because there is
no proxy to evaluate it.
The deployment path in the reference Kubernetes setup:
Hermes Agent
│ HTTPS over Tailscale
▼
Tailscale Kubernetes Ingress
│
▼
Jenkins MCP Server /mcp
│ HTTPS through Tailscale egress
▼
Jenkins controllerHermes never receives the Jenkins API token. The token stays in a Kubernetes Secret or external secret provider and is used only by the MCP server.
Quick start with Docker
cp .env.example .env
# Configure Jenkins URL, username, token, and CA bundle.
docker build --build-arg APP_VERSION=$(cat VERSION) \
-t jenkins-mcp-server:$(cat VERSION) .
docker run --rm \
--env-file .env \
-p 8000:8000 \
-p 8081:8081 \
-v "$PWD/certs:/certs:ro" \
jenkins-mcp-server:$(cat VERSION)Or use the maintained Compose deployment, which applies a read-only root filesystem, dropped capabilities, writable temporary mounts, and an audit volume:
cp .env.example .env
# Edit .env, keep it out of source control, and restrict its permissions.
docker compose up server
# Run the single-container Minibridge variant instead. Its sample policy
# allows every non-destructive tool and refuses @destructive.
docker compose --profile minibridge up minibridgeDo not start both services together because they publish the same MCP port.
Health endpoints:
GET http://localhost:8081/healthz
GET http://localhost:8081/readyzMCP endpoint:
http://localhost:8000/mcpHelm installation
kubectl create namespace jenkins-mcp
kubectl -n jenkins-mcp create secret generic jenkins-mcp-secrets \
--from-literal=JENKINS_USERNAME=hermes-jenkins \
--from-literal=JENKINS_TOKEN='<JENKINS_API_TOKEN>'
helm upgrade --install jenkins-mcp \
oci://ghcr.io/grglzrv/charts/jenkins-mcp-server \
--version 1.23.0 \
--namespace jenkins-mcp \
--values examples/values/tailscale-production.yamlThe chart includes hardened pod settings, probes, NetworkPolicy,
PodDisruptionBudget, optional External Secrets, Tailscale ingress, and Tailscale
egress to Jenkins. Credentials can come from one existing Secret, separate
username and token Secret references, a chart-managed development Secret, or
External Secrets Operator. See
per-field-secret-refs.yaml for
the split-secret form.
For strict TLS, configure jenkins.url with Jenkins's exact Tailscale MagicDNS
FQDN and route the tailnet DNS zone through the Operator DNSConfig; do not
use the Kubernetes egress Service name as the HTTPS hostname.
Connecting a client
The server speaks Streamable HTTP. Point any MCP client at the /mcp path
of whichever address exposes it; the exact configuration keys differ per client,
so use its own documentation for the surrounding structure.
Deployment | Endpoint |
Helm chart, in-cluster |
|
Raw manifests, in-cluster |
|
Behind an ingress |
|
The Helm chart derives the Service name from the release, so a release named
jenkins-mcp in namespace jenkins-mcp gives
jenkins-mcp-jenkins-mcp-server.jenkins-mcp.svc.cluster.local. Read it back
rather than assuming:
kubectl -n <namespace> get svc -l app.kubernetes.io/name=jenkins-mcp-server \
-o jsonpath='{.items[0].metadata.name}'With an ingress, the controller assigns the hostname asynchronously:
kubectl -n <namespace> get ingress -l app.kubernetes.io/name=jenkins-mcp-server \
-o jsonpath='{.items[0].status.loadBalancer.ingress[0].hostname}'Whichever client you use, it never receives the Jenkins API token. The token stays in a Kubernetes Secret and is used only by this server.
Security and guardrails
Two layers, applied independently.
Layer 1 — server policy (mcp.*), always enforced
Enforced inside the Python process. It applies whether or not minibridge is deployed, and cannot be bypassed by a client.
JENKINS_VERIFY_TLS=true
MCP_READ_ONLY=false
MCP_ALLOW_JOB_WRITE=true
MCP_ALLOW_BUILD_WRITE=true
MCP_ALLOW_NODE_WRITE=false
MCP_ALLOW_ADMIN_REQUEST=false
MCP_ALLOWED_JOBS=AI/*,Platform/*Destructive actions are gated separately from ordinary writes, so an agent can create and trigger jobs while never being able to delete one. Each destructive action must clear its category flag, the master switch, and its own flag.
Variable | Chart value | Default | Covers |
|
|
| Master switch for all of the below |
|
|
|
|
|
|
|
|
|
|
|
|
To disable every irreversible action at once while keeping reads, job creation and build triggering:
mcp:
allowDestructive: falseMCP_READ_ONLY=true overrides everything, and MCP_ALLOWED_JOBS restricts every
tool to matching job paths. Job names containing . or .. segments are
rejected at both the policy and URL layers.
Layer 2 — minibridge proxy (optional)
Minibridge terminates MCP over HTTP,
evaluates a Rego policy on every request and response, and
speaks stdio to the server it spawns. It requires the -minibridge image built
from docker/Dockerfile.minibridge.
minibridge:
enabled: trueThe chart selects ghcr.io/grglzrv/jenkins-mcp-server:<version>-minibridge,
published alongside the default image on every release. edge-minibridge
tracks main. The chart runs one container: its entrypoint starts Minibridge,
which spawns jenkins-mcp-server --transport stdio. Minibridge v0.8.0 is
checksum-pinned rather than fetched from latest, since a proxy in the request
path should not change enforcement behaviour on an unrelated rebuild.
Credential injection is unchanged with the proxy on or off: JENKINS_TOKEN
always arrives via secretKeyRef from a Kubernetes Secret, which External
Secrets can populate from GCP Secret Manager.
Disabling destructive tools and capabilities
minibridge.tools is a policy over the server's whole tool surface. The
default is allow-all — with both lists empty every tool and capability is
permitted, and restriction is entirely opt-in.
Entries are a bare tool name or a group:
Group | Tools |
|
|
|
|
|
|
|
|
| every tool |
Exclude only the irreversible tools, keeping everything else:
minibridge:
enabled: true
tools:
deny: ["@destructive"]A strict read-only deployment — a non-empty allow becomes an allowlist:
minibridge:
tools:
allow: ["@read"]deny always wins over allow. Denied tools are refused on tools/call and
filtered out of tools/list, so the agent never sees a tool it cannot use.
Whole MCP capabilities are gated by method name:
minibridge:
methodsDeny: ["resources/read"]Every one of the 23 tools belongs to exactly one group, asserted by a test so the groups cannot drift from the server.
Guardrails
Heuristic content inspection, independent of the tool policy above. All are off by default; enable only what you need.
Guardrail | What it does |
| Detects hidden or obfuscated directives in tool descriptions and responses, such as a build log carrying |
| Flags references to sensitive surfaces. Jenkins-aware: the script console ( |
| Identifies tool descriptions or responses that try to override or redirect other tools |
| Rejects out-of-schema argument names ( |
| Blocks descriptions and responses that reference tools outside this server. This server's own 23 tool names are excluded so they do not trip it |
| Replaces credentials with |
minibridge:
guardrails:
- secrets-redaction
- sensitive-pattern-detection
- covert-instruction-detectionThe policy has 29 OPA tests covering both directions — that clean console output
and this server's own tool names are not flagged, and that injection, traversal
and token leakage are. They run in CI via the policy job.
Shared-secret authentication
A lightweight auth layer checked by the policy against the Authorization
header. The secret is referenced from a Kubernetes Secret and never inlined in
values:
minibridge:
basicAuth:
enabled: true
existingSecret: jenkins-mcp-server-credentials
secretKey: BASIC_AUTH_SECRETIf that Secret is managed by External Secrets, add the key to
externalSecret.extraData — otherwise the chart fails the render with an
explanation rather than producing a pod that cannot start.
Use it only in controlled environments, rotate the secret, and always pair it
with TLS (minibridge.tls, which also supports mTLS via clientCASecretKey).
Enforcement
minibridge:
policer:
enforce: true # false logs the verdict and lets traffic through
rego:
enabled: true
policy: /policy.rego
http:
enabled: false # or delegate to a remote HTTP policer
url: ""
token:
existingSecret: ""
secretKey: MINIBRIDGE_POLICER_HTTP_BEARER_TOKENThe Rego and HTTP policers are mutually exclusive. For encrypted listener keys,
minibridge.tls.passSecretKey reads the passphrase from the TLS Secret, while
minibridge.tls.pass.valueFrom can reference a different Secret and key.
Recommended posture
Use a dedicated Jenkins service account. Keep jenkins_admin_request disabled
unless there is a reviewed operational requirement, keep allowJobDelete: false,
restrict MCP_ALLOWED_JOBS to controlled folders, and keep destructive tools
behind human approval in the agent. Setting minibridge.tools.deny: ["@destructive", "@admin"] gives defence in depth: the proxy refuses the call
and never advertises the tool, and the server would refuse it anyway.
Development
make install
make lint
make coverage
make verify-versionWith Helm installed:
make helm-lint
make helm-templateFull Docker-based Jenkins TLS integration test:
make integrationReleases and versioning
One canonical semantic version is synchronized across the Python package, Helm chart, application image, and production Kustomize overlay. The chart is never left pointing at a stale image, because it does not pin an image tag at all:
image:
repository: ghcr.io/grglzrv/jenkins-mcp-server
tag: "" # empty means use Chart.appVersionSo Chart.appVersion is the image tag. Bumping the version moves the chart and
the image together by construction.
NEW_VERSION=1.23.0
make version VERSION="$NEW_VERSION" # prepares notes and rewrites every pin
git commit -am "chore(release): prepare v$NEW_VERSION"
git push origin "release/v$NEW_VERSION"
# Open a PR and merge it after every required check is green.make version rewrites all 22 managed application-version pins across 17
files: VERSION,
pyproject.toml, src/jenkins_mcp_server/__init__.py, the chart's version
and appVersion, both README install commands, the Kustomize base,
production and minibridge overlays, the standalone minibridge deployment, the
example values, Compose deployment, and all versioned Argo CD applications.
scripts/check_version.py then asserts every declared pin exists exactly where
expected and agrees. It additionally scans every small UTF-8 file in the
repository, regardless of directory or extension, for application image tags,
Helm install versions, Argo CD revisions, Kustomize tags, Compose defaults, and
release examples. A newly added manifest or README with a stale version fails
CI until it is added to the canonical pin inventory.
Before it rewrites a pin, make version promotes the completed [Unreleased]
section in CHANGELOG.md to a dated version entry and recreates the empty
template. Every release must explicitly cover highlights, new features,
improvements, bug fixes, breaking changes, known issues, security, and upgrade
notes. Use None or None known where appropriate; placeholders such as
None yet, TBD, and TODO are rejected in a release entry. The GitHub
Release publishes this validated entry verbatim instead of generating primary
notes from commit titles.
When the validated version-change pull request merges to main, the release
workflow starts automatically. It refuses to publish anything if these do not
agree:
test "${version}" = "$(cat VERSION)" # requested release must match VERSION
python scripts/check_version.py # every versioned artifact must agree
python scripts/changelog.py validate # release notes must be complete
python scripts/check_release_bump.py "$(git merge-base HEAD origin/main)"The release-bump check covers application/package inputs, both runtime images, functional chart files, Compose, production manifests, Argo CD applications, and shipped values. It requires a strictly newer SemVer and reports every path that needs the release. Documentation, tests, integration fixtures, and workflow-only changes do not force a version bump.
Only after that gate passes does it build the multi-architecture image (tagged
with the full version, major/minor, major, and latest), package the chart at the same version, push
both to GHCR, and create the GitHub Release from the curated changelog entry
with provenance and SBOM metadata.
A matching annotated tag can still trigger the same idempotent workflow as a manual recovery path. If the GitHub Release already exists, the run validates the version and source tag before safely skipping republication. Release runs are serialized so a recovery tag cannot race automatic publication.
Two consequences worth knowing:
:edgenever touches the chart. Every push tomainpublishesghcr.io/grglzrv/jenkins-mcp-server:edge, but the chart only ever referencesappVersion. Edge images are opt-in viaimage.tag: edge.Chart-only changes still need a full version bump, since chart
versionandappVersionare deliberately locked together. That trades Helm's convention of versioning the chart independently for the guarantee that a chart version identifies exactly one application build.
Documentation
Attribution
This is not an official Jenkins project. Jenkins is a registered trademark of the Continuous Delivery Foundation.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-quality-maintenanceA Model Context Protocol (MCP) server that enables AI tools like chatbots to interact with and control Jenkins, allowing users to trigger jobs, check build statuses, and perform other Jenkins operations through natural language.Last updated
- AlicenseBqualityBmaintenanceA server that enables interaction with Jenkins CI/CD pipelines from any compatible MCP client (like Claude Desktop), allowing users to manage jobs, builds, coverage reports, and other Jenkins functionality through natural language.Last updated1157MIT
- Alicense-qualityDmaintenanceAn MCP server for interacting with a Jenkins CI/CD server. Allows you to trigger jobs, check build statuses, and manage your Jenkins instance through MCP.Last updated6613Apache 2.0
- Alicense-qualityAmaintenanceMCP server for Jenkins to inspect builds, control jobs, and manage pipeline configuration.Last updated9MIT
Related MCP Connectors
The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.
MCP server for generating rough-draft project plans from natural-language prompts.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/grglzrv/jenkins-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server