Skip to main content
Glama
RadhaKrishna0018

netlinq-jenkins-mcp

netlinq-jenkins-mcp

Ein kleiner Python-Dienst, der Ihren privaten Jenkins-Controller umschließt und es einem Team ermöglicht, die Jobs NetLinQ EMS Release pipeline und Patch Single Repository Pipeline durch natürliche Sprache auszulösen. Eine Codebasis, zwei Ausführungsmodi:

  1. MCP-Server (stdio) - in Cursor auf Ihrem Laptop einbinden und fragen: "build 7.0 release package" oder "rebuild blinq-ems-charts at tag 7.0.3".

  2. FastAPI-Web-App + Chat-UI - ein Befehl docker compose up auf einem internen Server, das gesamte Team loggt sich über den Browser ein und erhält dieselben Tools.

Hosting-Hinweis: GitHub-gehostete Runner können keinen privaten Jenkins erreichen. Der Code liegt in einem privaten GitHub-Repo; die Laufzeit läuft dort, wo sie einen Netzwerkpfad zu Jenkins hat (der Laptop eines Teammitglieds mit VPN oder eine interne Linux-VM).


Inhaltsverzeichnis


Architektur

flowchart LR
    subgraph github [Private GitHub Repo]
        repo[netlinq-jenkins-mcp]
    end

    subgraph local [Local laptop - DevOps user]
        cursor[Cursor IDE]
        mcp["FastMCP stdio server<br/>mcp_server.py"]
        cursor -->|stdio| mcp
    end

    subgraph shared [Internal VM - team]
        web["FastAPI web app<br/>web.py + Vite UI"]
        chat["Chat UI - browser"]
        chat -->|HTTPS basic auth| web
    end

    subgraph core [Shared Python core]
        tools["tools.py<br/>5 tool functions"]
        llm["llm.py<br/>LiteLLM router"]
        jc["jenkins_client.py<br/>httpx + crumb"]
    end

    repo -.git clone.-> local
    repo -.git clone.-> shared

    mcp --> tools
    web --> llm
    web --> tools
    llm -->|"tool calls"| tools
    tools --> jc
    jc -->|REST + basic auth| jenkins[(Jenkins<br/>private network)]

tools.py ist die einzige Quelle der Wahrheit. Sowohl der MCP-Server als auch der LiteLLM-Agent in der Web-App rufen dieselben fünf Funktionen auf, sodass das Verhalten zwischen Cursor und der Team-Chat-UI identisch ist.

Die fünf Tools:

Tool

Was es tut

trigger_release_build(version)

Stellt die NetLinQ EMS Release pipeline für eine Version wie 7.0 in die Warteschlange

patch_repository(repo, tag)

Stellt die Patch Single Repository Pipeline für ein Repo bei einem existierenden Tag in die Warteschlange

get_build_status(pipeline, build_number?)

Ergebnis, Dauer, Parameter des letzten oder eines spezifischen Builds

list_recent_builds(pipeline, limit?)

Verlauf (neueste zuerst)

tail_build_log(pipeline, build_number, n_lines?)

Letzte N Zeilen der Konsolenausgabe


Schnellstart - MCP in Cursor

Vollständige Anleitung: docs/CURSOR_MCP.md. Kurzfassung:

  1. Generieren Sie ein Jenkins-API-Token unter <JENKINS_URL>/me/configure -> Add new Token.

  2. Installieren Sie uv: pipx install uv

  3. Bearbeiten Sie ~/.cursor/mcp.json (Windows: %USERPROFILE%\.cursor\mcp.json):

    {
      "mcpServers": {
        "netlinq-jenkins": {
          "command": "uvx",
          "args": [
            "--from",
            "git+ssh://git@github.com/<your-org>/netlinq-jenkins-mcp.git@main",
            "netlinq-jenkins-mcp"
          ],
          "env": {
            "JENKINS_URL": "https://jenkins.internal.example.com",
            "JENKINS_USER": "your-user",
            "JENKINS_TOKEN": "your-api-token"
          }
        }
      }
    }
  4. Starten Sie Cursor neu. Achten Sie auf den grünen Punkt neben netlinq-jenkins in Einstellungen -> MCP.

  5. Versuchen Sie im Chat: "build 7.0 release package". Der Agent wird dies bestätigen, bevor er Jenkins tatsächlich auslöst.


Schnellstart - Team-Chat-UI (Docker)

git clone git@github.com:<your-org>/netlinq-jenkins-mcp.git
cd netlinq-jenkins-mcp
cp .env.example .env
# edit .env: JENKINS_*, LLM_*, WEB_USERS

# Create at least one web user. The hash MUST be bcrypt-hashed.
python -c "from passlib.hash import bcrypt; print('alice:' + bcrypt.hash('secret123'))"
# paste the line into WEB_USERS=

docker compose up -d --build
# browse http://<host>:8000 - log in with alice / secret123

Was das Team sieht:

  • Chateingabe unten, Gesprächsverlauf in der Mitte.

  • Live-Panels für "kürzliche Builds" für beide Pipelines auf der rechten Seite, alle 5 Sekunden aktualisiert.

  • Tool-Call-Karten erweitern sich inline, sodass jeder genau sehen kann, was der Bot tut.

  • Ein "Reset"-Button im Header löscht das Gedächtnis des Agenten.


Lokale Entwicklung (ohne Docker)

# Python side
python -m venv .venv
.\.venv\Scripts\Activate.ps1     # PowerShell
# or:  source .venv/bin/activate  # bash
pip install -e ".[dev]"

# Frontend side (only needed for the web mode)
cd ui
npm install
npm run build       # writes ui/dist/, which web.py auto-serves
cd ..

# Run the web app
netlinq-jenkins-web
# or, with auto-reload:
uvicorn netlinq_jenkins.web:create_app --factory --reload --port 8000

# Or run as MCP (stdio - the way Cursor will spawn it)
netlinq-jenkins-mcp

# Run tests
pytest

Konfigurationsreferenz

Alle Einstellungen stammen aus Umgebungsvariablen (oder einer .env-Datei). Siehe .env.example für die kanonische Liste.

Variable

Standard

Zweck

JENKINS_URL

erforderlich

Basis-URL des Jenkins-Controllers

JENKINS_USER

erforderlich

Benutzername des Dienstkontos

JENKINS_TOKEN

erforderlich

API-Token (bevorzugt) oder Passwort

JENKINS_CA_BUNDLE

leer

Pfad zu einem CA-Bundle für selbstsignierte TLS-Zertifikate, oder false zum Überspringen der Verifizierung

RELEASE_PIPELINE_NAME

NetLinQ EMS Release pipeline

Überschreiben, falls Ihr Job anders heißt

RELEASE_VERSION_PARAM

VERSION

Name des Versionsparameters des Jobs

PATCH_PIPELINE_NAME

Patch Single Repository Pipeline

Name der Patch-Pipeline

PATCH_REPO_PARAM

REPO

Name des Repo-Parameters der Patch-Pipeline

PATCH_TAG_PARAM

TAG

Name des Tag-Parameters der Patch-Pipeline

LLM_PROVIDER

openai

Informativ - LiteLLM wählt basierend auf LLM_MODEL

LLM_MODEL

gpt-4o

Jeder LiteLLM-unterstützte Modell-String

LLM_API_KEY

-

Anbieter-Schlüssel (nur Web-Modus)

LLM_API_BASE

-

Für Azure / Ollama / selbstgehostete Endpunkte

WEB_HOST

0.0.0.0

FastAPI-Bind-Host

WEB_PORT

8000

FastAPI-Bind-Port

WEB_USERS

leer

user1:bcrypt-hash,user2:bcrypt-hash für Web-Basic-Auth

WEB_API_SHARED_SECRET

-

Optionaler X-API-Secret-Header-Wert für /api/*

AUDIT_LOG_PATH

audit.jsonl

JSONL-Datei, an die jeder Tool-Aufruf angehängt wird


Jenkins-Parameternamen entdecken

Wenn VERSION / REPO / TAG nicht Ihre tatsächlichen Parameternamen sind, fragen Sie Jenkins:

curl -s -u "$JENKINS_USER:$JENKINS_TOKEN" \
  "$JENKINS_URL/job/NetLinQ%20EMS%20Release%20pipeline/api/json?tree=property[parameterDefinitions[name,type,defaultParameterValue[value]]]" \
  | jq

Überschreiben Sie dann die entsprechende *_PARAM-Umgebungsvariable in .env oder in Ihrer Cursor mcp.json.


Tipps für LLM-Anbieter

Der Web-Modus verwendet LiteLLM, sodass Sie Anbieter rein über Umgebungsvariablen wechseln können. Häufige Kombinationen:

Anbieter

LLM_MODEL

LLM_API_KEY

LLM_API_BASE

OpenAI

gpt-4o

sk-...

-

Anthropic

claude-sonnet-4-5

sk-ant-...

-

Azure OpenAI

azure/<deployment>

Azure-Schlüssel

https://<resource>.openai.azure.com

Ollama (lokal)

ollama/llama3.1

-

http://localhost:11434

OpenAI-kompatibel

openai/<model>

Schlüssel

https://your.host/v1

Der MCP-in-Cursor-Modus benötigt nichts davon - Cursors eigenes Modell steuert das Gespräch und ruft einfach unsere Tools auf.


Sicherheitshinweise

  • .env wird von Git ignoriert - Geheimnisse verlassen niemals den Host.

  • Der Web-Modus erfordert HTTP-Basic-Auth (bcrypt-gehasht in WEB_USERS).

  • Ein optionales WEB_API_SHARED_SECRET fügt einen header-basierten zweiten Faktor für /api/* hinzu, gedacht für Deployments "hinter einem Reverse Proxy".

  • Es ist kein eingehender Internetverkehr erforderlich - die App erreicht nur Jenkins.

  • API-Token werden gegenüber Passwörtern bevorzugt: Token umgehen den CSRF-Crumb-Prozess und sind einfacher zu widerrufen.

  • Eingaben werden vor jedem HTTP-Aufruf mit strengen Regexes (version, repo, tag) validiert, sodass ein gesprächiges LLM keine Shell-Metazeichen einschleusen kann.

  • Jeder Tool-Aufruf wird an das Audit-Log angehängt (siehe unten).


Audit-Log

Jeder erfolgreiche Trigger schreibt eine JSONL-Zeile in ${AUDIT_LOG_PATH}:

{"ts": "2026-05-06T20:30:11+00:00", "event": "trigger",
 "pipeline": "NetLinQ EMS Release pipeline",
 "parameters": {"VERSION": "7.0"},
 "queue_url": "https://jenkins.internal.example.com/queue/item/812/"}

Im Docker-Modus ist die Datei auf dem Host unter ./logs/audit.jsonl eingebunden.


Projektstruktur

netlinq-jenkins-mcp/
├── src/netlinq_jenkins/
│   ├── config.py          # pydantic-settings
│   ├── jenkins_client.py  # async httpx wrapper, crumb handling
│   ├── tools.py           # 5 tool functions, used by both modes
│   ├── llm.py             # LiteLLM tool-calling agent (web mode only)
│   ├── mcp_server.py      # FastMCP stdio entrypoint (Cursor)
│   └── web.py             # FastAPI app + serves the bundled UI
├── ui/                    # Vite + React + Tailwind chat UI
│   ├── src/App.tsx        # main chat layout
│   └── src/components/    # ToolCard, BuildsPanel
├── tests/                 # pytest + pytest-httpx
├── docs/CURSOR_MCP.md     # detailed Cursor integration guide
├── examples/cursor-mcp.json
├── Dockerfile             # multi-stage: builds UI, then Python wheel
├── docker-compose.yml
├── .env.example
└── pyproject.toml

Roadmap / nächste Schritte

  • [ ] OIDC / SSO anstelle von HTTP-Basic für die Web-UI.

  • [ ] Slack-Bot-Adapter, der /build 7.0-Slash-Befehle an dieselben Tools weiterleitet.

  • [ ] Optionaler Read-Only-Modus (READ_ONLY=true), der die Trigger-Tools deaktiviert.

  • [ ] WebSocket-Log-Tail in der UI anstelle der abfragenden Seitenleiste.

  • [ ] Benutzerbezogenes Audit-Log anstelle einer globalen Datei.

F
license - not found
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

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/RadhaKrishna0018/netlinq-jenkins-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server