netlinq-jenkins-mcp
netlinq-jenkins-mcp
プライベートなJenkinsコントローラーをラップし、チームが自然言語でNetLinQ EMS Release pipelineおよびPatch Single Repository Pipelineジョブをトリガーできるようにする小さなPythonサービスです。コードベースは1つで、2つの実行モードがあります。
MCPサーバー (stdio) - ラップトップのCursorにプラグインし、"build 7.0 release package" や "rebuild blinq-ems-charts at tag 7.0.3" と尋ねることができます。
FastAPI Webアプリ + チャットUI - 社内サーバーで
docker compose upを1回実行するだけで、チーム全員がブラウザ経由でログインし、同じツールを利用できます。
ホスティングに関する注意: GitHubホスト型ランナーはプライベートなJenkinsに到達できません。 コードはプライベートなGitHubリポジトリに存在しますが、ランタイムはJenkinsへのネットワークパスがある場所(VPN接続されたチームメイトのラップトップや、社内のLinux VMなど)で実行する必要があります。
目次
アーキテクチャ
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 が唯一の信頼できる情報源です。MCPサーバーとWebアプリ内のLiteLLMエージェントの両方が同じ5つの関数を呼び出すため、CursorとチームチャットUIの間で動作は同一です。
5つのツール:
ツール | 動作 |
|
|
| 既存タグの1リポジトリに対して |
| 最新または特定のビルドの結果、期間、パラメータを取得します |
| 履歴(最新順)を取得します |
| コンソール出力の最後のN行を取得します |
クイックスタート - CursorでのMCP
完全なチュートリアル: docs/CURSOR_MCP.md。概要:
<JENKINS_URL>/me/configureでJenkins APIトークンを生成します -> Add new Token。uvをインストールします:pipx install uv~/.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" } } } }Cursorを再起動します。設定 -> MCP で netlinq-jenkins の横に緑色のドットが表示されていることを確認します。
チャットで "build 7.0 release package" と入力してみてください。エージェントはJenkinsをトリガーする前に確認を求めます。
クイックスタート - チームチャット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チームが見るもの:
下部にチャット入力、中央に会話のトランスクリプト。
右側に両方のパイプラインの「最近のビルド」パネル(5秒ごとにポーリング)。
ツール呼び出しカードがインラインで展開され、ボットが何をしているかを正確に確認可能。
ヘッダーの「Reset」ボタンでエージェントのメモリをクリア。
ローカル開発 (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設定リファレンス
すべての設定は環境変数(または .env ファイル)から読み込まれます。
標準的なリストについては .env.example を参照してください。
変数 | デフォルト | 目的 |
| 必須 | JenkinsコントローラーのベースURL |
| 必須 | サービスアカウントのユーザー名 |
| 必須 | APIトークン(推奨)またはパスワード |
| 空 | 自己署名TLS用のCAバンドルへのパス、または検証をスキップする場合は |
|
| ジョブ名が異なる場合に上書き |
|
| ジョブのバージョンパラメータ名 |
|
| パッチパイプライン名 |
|
| パッチパイプラインのリポジトリパラメータ名 |
|
| パッチパイプラインのタグパラメータ名 |
|
| 情報用 - LiteLLMが |
|
| |
| - | プロバイダーキー(Webモードのみ) |
| - | Azure / Ollama / セルフホストエンドポイント用 |
|
| FastAPIのバインドホスト |
|
| FastAPIのバインドポート |
| 空 | WebのBasic認証用 |
| - |
|
|
| すべてのツール呼び出しが追記されるJSONLファイル |
Jenkinsパラメータ名の確認
VERSION / REPO / TAG が実際のパラメータ名と異なる場合は、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その後、.env またはCursorの mcp.json で該当する *_PARAM 環境変数を上書きしてください。
LLMプロバイダーのヒント
Webモードは LiteLLM を使用しているため、環境変数だけでプロバイダーを切り替えることができます。一般的な組み合わせ:
プロバイダー |
|
|
|
OpenAI |
|
| - |
Anthropic |
|
| - |
Azure OpenAI |
| Azureキー |
|
Ollama (ローカル) |
| - |
|
OpenAI互換 |
| キー |
|
CursorでのMCPモードでは、これらは不要です。Cursor自身のモデルが会話を駆動し、ツールを呼び出します。
セキュリティ上の注意
.envはgit-ignoredであり、シークレットがホストから流出することはありません。WebモードはHTTP Basic認証(
WEB_USERSでbcryptハッシュ化)を必要とします。オプションの
WEB_API_SHARED_SECRETは、リバースプロキシの背後でのデプロイを想定し、/api/*に対してヘッダーベースの二要素認証を追加します。インバウンドのインターネットトラフィックは不要です。アプリはJenkinsに対してのみアウトバウンド通信を行います。
パスワードよりもAPIトークンが推奨されます。トークンはCSRFの制限を回避でき、取り消しも容易です。
入力はHTTP呼び出しの前に厳格な正規表現(
version,repo,tag)で検証されるため、LLMがシェルメタ文字を混入させることはできません。すべてのツール呼び出しは監査ログに追記されます(下記参照)。
監査ログ
成功したトリガーはすべて ${AUDIT_LOG_PATH} にJSONL行を書き込みます:
{"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/"}Dockerモードでは、ファイルはホスト上の ./logs/audit.jsonl にバインドマウントされます。
プロジェクト構成
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ロードマップ / 今後のステップ
[ ] Web UI用のHTTP Basic認証に代わるOIDC / SSO対応。
[ ]
/build 7.0スラッシュコマンドを同じツールに転送するSlackボットアダプター。[ ] トリガーツールを無効にするオプションの読み取り専用モード (
READ_ONLY=true)。[ ] ポーリングサイドバーに代わるUIでのWebSocketログテイル。
[ ] グローバルファイルではなく、ユーザーごとの監査ログ。
This server cannot be installed
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