Metadata-Version: 2.4
Name: jenkins_mcp_enterprise
Version: 1.0.3
Summary: MCP server for Jenkins integration with AI assistants, providing build management, log analysis, and failure diagnostics.
Author-email: Jordan Jarvis <your.email@domain.com>
Maintainer-email: Jordan Jarvis <your.email@domain.com>
License-Expression: GPL-3.0-only
Project-URL: Homepage, https://github.com/Jordan-Jarvis/jenkins-mcp-enterprise
Project-URL: Repository, https://github.com/Jordan-Jarvis/jenkins-mcp-enterprise
Project-URL: Documentation, https://github.com/Jordan-Jarvis/jenkins-mcp-enterprise/blob/main/README.md
Project-URL: Issues, https://github.com/Jordan-Jarvis/jenkins-mcp-enterprise/issues
Keywords: jenkins,mcp,ai,devops,model-context-protocol
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Build Tools
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: python-jenkins>=1.8.2
Requires-Dist: requests>=2.31.0
Requires-Dist: tiktoken>=0.5.0
Requires-Dist: APScheduler<4,>=3.11.0
Requires-Dist: modelcontextprotocol>=0.1.0
Requires-Dist: fastapi>=0.100.0
Requires-Dist: uvicorn>=0.23.0
Requires-Dist: httpx<1,>=0.24.0
Requires-Dist: websockets>=11.0
Requires-Dist: sse-starlette>=1.6.0
Requires-Dist: pyyaml>=6.0
Provides-Extra: vector
Requires-Dist: qdrant-client>=1.14.3; extra == "vector"
Requires-Dist: sentence-transformers>=2.2.0; extra == "vector"
Provides-Extra: dev
Requires-Dist: pytest>=7.4.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
Dynamic: license-file

# Jenkins MCP Server Enterprise

> Jenkins MCP server for multi-instance routing, build diagnostics, and optional vector search.

A Model Context Protocol (MCP) server for Jenkins that provides build management, log inspection, failure diagnostics, and multi-instance configuration. The maintained setup paths in this repository are source install and Docker/Compose.

## What It Does

- Trigger builds synchronously or asynchronously
- Find jobs before triggering or inspecting them
- Inspect job definitions and source locations
- Retrieve logs and run targeted log-search tools
- Discover downstream and sub-build hierarchies
- Inspect recent builds or a window around a specific build
- Diagnose build failures with configurable recommendations
- Route each tool call to the correct Jenkins instance based on `jenkins_url`
- Expose `semantic_search` only when vector search is enabled
- Expose `apply_job_edit` only when server-side job editing is enabled

## Quick Start

### Prerequisites

- Python 3.10+
- Jenkins API access
- Jenkins username and API token
- Docker and Docker Compose if you want container deployment
- Qdrant if you want `semantic_search`

### Install from Source

```bash
git clone https://github.com/Jordan-Jarvis/jenkins-mcp-enterprise
cd jenkins-mcp-enterprise
python3 -m pip install -e .
```

### Understand the Two Config Layers

The server uses two configuration layers:

- Primary server config: `config/mcp-config.yml`
- Diagnostic config: loaded from one of:
  - `--diagnostic-config /path/to/file.yml`
  - `JENKINS_MCP_DIAGNOSTIC_CONFIG=/path/to/file.yml`
  - `config/diagnostic-parameters.yml`
  - bundled defaults in `jenkins_mcp_enterprise/diagnostic_config/diagnostic-parameters.yml`

You always need the primary server config. You only need a project-local diagnostic config file if you want to override the bundled diagnostic defaults.

### Create the Primary Server Config

```bash
mkdir -p config
cp config/mcp-config.example.yml config/mcp-config.yml
```

Edit `config/mcp-config.yml` with your Jenkins URLs and credentials.

If you want the optional Jenkins-managed job edit workflow for non-SCM-backed jobs, also set:

```yaml
settings:
  enable_job_editing: true
  job_edit_workspace_dir: "/tmp/mcp-jenkins/job-definitions"
```

### Optional Project-Local Diagnostic Override

Create this only if you want to tune `diagnose_build_failure`:

```bash
cat > config/diagnostic-parameters.yml << 'ENDDIAG'
semantic_search:
  min_diagnostic_score: 0.65
  max_total_highlights: 4

recommendations:
  max_recommendations: 5
ENDDIAG
```

If you want semantic search, start the local vector stack and set `disable_vector_search: false` with `vector.host: "http://localhost:6333"`:

```bash
./scripts/start_dev_environment.sh
```

### Docker and Compose

```bash
cp config/mcp-config.example.yml config/mcp-config.yml
./start-jenkins_mcp_enterprise.sh
```

See [README-Docker.md](README-Docker.md) for the container deployment flow.

### Start the Server

```bash
jenkins_mcp_enterprise --config config/mcp-config.yml
```

### Connect to Claude Desktop

Add to `~/.claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "jenkins": {
      "command": "jenkins_mcp_enterprise",
      "args": ["--config", "config/mcp-config.yml"]
    }
  }
}
```

## Usage Notes

- Pass full Jenkins build URLs when a tool or prompt relies on `jenkins_url`.
- In multi-Jenkins setups, each tool call resolves exactly one configured instance from `jenkins_url`. The server does not fan out across all configured Jenkins instances for a single call.
- `semantic_search` is available only when vector search is enabled.
- `apply_job_edit` is available only when `settings.enable_job_editing: true`.
- `get_job_definition` returns SCM location details for SCM-backed pipelines. For inline pipelines, it stages a local Groovy file for patch/edit/upload. For other Jenkins-managed jobs, it stages `config.xml`.
- `diagnose_build_failure` always uses a diagnostic config layer. If you do not provide a project-local override, the bundled defaults are used.
- The Docker image includes `ripgrep`, so `ripgrep_search` and `navigate_log` work in container deployments.

## Common Usage Patterns

```text
Analyze this failed build: https://jenkins.company.com/job/api-service/456/
Find the root cause in this nested pipeline: https://jenkins.company.com/job/monorepo/job/main/789/
Show me the test failure section from this build: https://jenkins.company.com/job/tests/321/
Find similar authentication failures in recent builds
```

## Available Tools

| Tool | Purpose |
|------|---------|
| `trigger_build` | Start a build and wait for completion |
| `trigger_build_async` | Queue a build without waiting for completion |
| `trigger_build_with_subs` | Trigger a build and track downstream/sub-build execution |
| `get_jenkins_job_parameters` | Inspect job parameters before triggering builds |
| `find_jobs` | Search jobs by name, path, or URL on one resolved Jenkins instance |
| `list_job_builds` | List recent builds for a job, or a small window around a target build number |
| `get_build_info` | Fetch metadata for a specific build or `lastBuild` |
| `get_job_definition` | Inspect whether a job is SCM-backed, inline, multibranch, or XML-backed |
| `ripgrep_search` | Search logs with regex and context windows |
| `filter_errors_grep` | Filter logs with common error-oriented patterns |
| `navigate_log` | Jump to sections or occurrences inside a log |
| `get_log_context` | Fetch targeted log ranges or chunks |
| `diagnose_build_failure` | AI-assisted failure diagnosis using logs, hierarchy data, and configured recommendations |
| `semantic_search` | Vector-backed similarity search across log chunks when vector search is enabled |
| `apply_job_edit` | Upload a locally edited staged job definition back to Jenkins when job editing is enabled |

## Configuration Documentation

- [Configuration Guide](config/README.md)
- [Diagnostic Config Overview](config/README-diagnostic-config.md)
- [Diagnostic Parameters Guide](config/diagnostic-parameters-guide.md)
- [Diagnostic Parameters Quick Reference](config/diagnostic-parameters-quick-reference.md)

## Development

```bash
# Start local supporting services when vector search is enabled
./scripts/start_dev_environment.sh

# Run tests
python3 -m pytest tests/ -v

# Format code
python3 -m black .
```

## License

GPL v3
