Jenkins MCP server
Servidor MCP Jenkins com leitura prioritária em Go para depuração de builds orientada por agente. 20 ferramentas incluindo compare_builds, detecção de testes instáveis, análise de falhas JUnit/Ginkgo e logs de console em cache em disco com transferência de caminho em disco. Ferramentas de escrita (acionar/parar/cancelar) controladas pela variável de ambiente JENKINS_MCP_READONLY.
Documentação
jenkins-mcp-go
Um servidor Model Context Protocol (MCP) focado e rápido para Jenkins, escrito em Go.
Conecte o Jenkins ao Claude Desktop, Claude Code, Cursor ou qualquer agente de IA compatível com MCP: obtenha logs de console, inspecione estágios de pipeline, analise relatórios de teste JUnit e Ginkgo, compare duas builds, classifique testes instáveis, dispare e cancele builds e gerencie a fila de builds — tudo por um único transporte MCP stdio, a partir de um único binário Go estático.
Por que jenkins-mcp-go?
A maioria das integrações com Jenkins espera um humano no teclado. Agentes de LLM precisam de algo diferente: respostas pequenas e estruturadas; um caminho claro de "build falhou" para "aqui está a linha que falhou"; e a capacidade de pesquisar um log de console de vários gigabytes sem baixá-lo novamente a cada pergunta.
jenkins-mcp-go foi construído para esse fluxo de trabalho:
- Leitura primeiro, gravações opt-out. As ferramentas de leitura estão sempre ativas. As ferramentas de gravação (
trigger_build,stop_build,cancel_queue_item) são controladas porJENKINS_MCP_READONLY: defina a variável de ambiente e o servidor registra apenas a superfície de leitura. - Host único, credencial única. Ele fala com uma única URL do Jenkins com um único token de API, configurado por variáveis de ambiente. Sem superfície multi-tenant, sem cofre de credenciais para uso indevido.
- Formato de triagem, não de API. As ferramentas respondem às perguntas que os agentes realmente fazem — "o que mudou entre a build A e a B?" (
compare_builds), "quais testes neste job são instáveis?" (get_flaky_candidates), "quais commits e arquivos afetaram esta build?" (get_scm_context) — em vez de espelhar os endpoints do Jenkins um a um. - Feito para janelas de contexto. Cada ferramenta de listagem aceita um filtro RE2 e um limite.
get_console_log_pathretorna o caminho em disco do log de uma build concluída para que o agente possaRead/Grep/Bashnativamente em vez de transmitir gigabytes pelo MCP. - Logs de console em cache em disco. Builds concluídas são salvas uma vez e reutilizadas. O cache é indexado por caminho do job + número da build, limitado por tamanho total e removido por LRU mtime.
- Ciente de Pipeline e Ginkgo. Além do console bruto, ferramentas dedicadas analisam
/wfapi/describe,/testReport/api/jsone o blocoSummarizing N Failuredo Ginkgo para que o agente receba informações de falha pré-digeridas. - Um único binário estático. Go puro. Sem runtime Python, sem Docker necessário.
Ferramentas
| Ferramenta | Finalidade |
|---|---|
health_check | Valida a configuração do servidor: acessibilidade e versão do Jenkins, usuário autenticado, emissor de CSRF crumb, presença dos plugins Pipeline/JUnit, contagens de nós online/offline, desvio de relógio e a configuração efetiva com a qual o processo está rodando. |
get_plugin_versions | Lista os plugins do Jenkins instalados com versões, flag de fixação e flag de atualização pendente. name_filter (RE2) e include_inactive opcionais. 403 degrada para uma dica clara. |
whoami_can | Verifica em um job as permissões efetivas de Leitura / Build / Cancelamento / Configuração do token configurado por meio de requisições GET somente leitura. Útil antecipadamente para evitar um 403 em um disparo ou cancelamento. Permanece somente leitura mesmo quando JENKINS_MCP_READONLY=false. |
list_jobs | Enumera jobs e pastas sob um caminho (ou raiz). Recursão opcional e filtro de nome RE2 sem diferenciar maiúsculas/minúsculas; limitado a 500 entradas. |
list_branches | Enumera os branches de um WorkflowMultiBranchProject com número da última build por branch, resultado, duração e timestamp. name_filter (RE2) e healthy_only opcionais. |
get_console_log | Exibe o final do /consoleText da build. Padrão: últimas 500 linhas; passe tail_lines: -1 para o log completo. |
get_console_log_path | Força o cache do log completo de uma build concluída e retorna seu caminho em disco para que o agente possa Read/Grep/Bash nativamente. |
search_console_log | Busca regex RE2 no log de console com janelas de contexto cientes do número da linha. |
tail_running_build | Final limitado e com rastreamento de offset do console de uma build em andamento via progressiveText do Jenkins. Envie Next since_byte de volta para paginar. Nunca grava no cache em disco. |
get_build_info | Resumo da build formatado: resultado, duração, parâmetros, conjunto de alterações. |
get_build_environment | Três seções para uma build: Causa (motivo do disparo verbatim), Parâmetros (segredos mascarados exibidos como (masked)) e Variáveis de Ambiente Injetadas via EnvInject. O RE2 name_filter opcional restringe a seção de variáveis de ambiente. Degrada em EnvInject 404. |
get_scm_context | Histórico por commit de uma build: id do commit, autor, timestamp, assunto da mensagem e caminhos afetados de cada commit com códigos de edição A/M/D. Os conjuntos de alterações do Pipeline são achatados com cabeçalhos por conjunto. RE2 path_filter opcional. |
last_green_build | Informa a build bem-sucedida mais recente de um job. Retorna número, horário de término (UTC) e URL — o ponto de partida para bisect-from-green. |
changes_since_last_green | Une os commits de todas as builds concluídas desde o último green do job. Percorre previousCompletedBuild, deduplica por commitId, suporta path_filter e max_commits. Exibe rodapés de 'tudo verde' e janela ampla. |
compare_builds | Compara duas builds do mesmo job em resultado, duração, parâmetros, commits SCM, estágios de pipeline e testes JUnit. O agente responde "o que mudou entre A e B?" em uma única chamada. |
get_pipeline_stages | Lista os estágios de Pipeline Declarativo/Scripted via /wfapi/describe com status e duração. |
get_stage_log | Obtém o log de um único estágio de pipeline via /execution/node/<id>/wfapi/log. |
get_pipeline_script | Retorna o Jenkinsfile que uma build específica realmente executou. Tenta o plugin Replay primeiro (fixado na build), recorre a config.xml (nível de job — proveniência exibida). Retorna coordenadas SCM como dica para jobs Pipeline-from-SCM. |
get_test_report | Resultados JUnit estruturados de /testReport/api/json, com casos com falha e início+fim dos stack traces. |
get_flaky_candidates | Classifica testes instáveis nas últimas N builds concluídas de um job contando alternâncias pass↔fail. Retorna uma tabela ordenada com nome do teste, contagem de alternâncias, totais de pass/fail e última build em que foi visto. |
get_test_history | Tendência por build de um único teste nas últimas N builds concluídas — o acompanhamento de get_flaky_candidates quando um suspeito é conhecido. Linha do tempo (nº da build, resultado, status, duração, início do erro) além de um resumo de contagens e alternâncias. |
find_test_by_name | Localiza qual job executa um teste cujo nome completo contém uma substring. Percorre list_jobs(recursive) sob folder_path, distribui sondagens por job contra lastCompletedBuild/testReport com timeout de 5s por job e renderiza uma tabela ordenada de resultados. |
find_recent_failures | Levanta builds com falha nos jobs sob folder_path dentro de uma janela de retrospectiva. Sondagem por job das últimas 5 builds; filtra por since (padrão 24h; suporta Nd) e result_filter (FAILURE/UNSTABLE/ABORTED/ANY_NON_SUCCESS). |
list_pr_builds | Lista todas as builds de um PR em um WorkflowMultiBranchProject. Sonda as convenções comuns de nomenclatura de branch de PR em paralelo (PR-N, pull/N/head, change-N, pr/N) e renderiza o histórico de builds da primeira correspondência. |
get_ginkgo_failure_summary | Analisa o bloco Summarizing N Failure do Ginkgo e exibe o primeiro [ERROR] marcado com cada nome de spec. |
list_nodes | Lista agentes/nós do Jenkins com status, contagens de executores, labels e resumos de monitoramento. |
get_node | Detalhe por nó: status, estado ocioso por executor, labels, dados completos de monitoramento. |
list_queue | Lista itens pendentes da fila do Jenkins com o motivo do bloqueio de cada um. |
cancel_queue_item | Remove um item pendente da fila por id. Mutante; suprimido quando JENKINS_MCP_READONLY está definido. |
trigger_build | Enfileira uma build, opcionalmente com parâmetros; pode bloquear até que a build receba um número. Mutante. |
stop_build | Cancela uma build em execução. Mutante. |
As ferramentas direcionadas a builds aceitam um job_path (separado por barras, ex.: Builds/team/job-name) e um build_number opcional (0 ou omitido = lastBuild). Uma URL como https://jenkins.example.com/job/Builds/job/team/job/job-name/86/ vira job_path="Builds/team/job-name", build_number=86. list_jobs aceita um folder_path no mesmo formato separado por barras (vazio = raiz).
Consulte docs/TOOLS.md para a referência completa de parâmetros.
Instalação
Binários pré-compilados
Baixe o arquivo para seu sistema operacional e arquitetura na página de Releases e coloque o binário jenkins-mcp no seu PATH.
Via go install
go install github.com/2001adarsh/jenkins-mcp-go@latest
O binário vai para $(go env GOBIN) (ou $(go env GOPATH)/bin).
Via Docker
Imagens multi-arquitetura pré-compiladas são publicadas no GitHub Container Registry:
docker pull ghcr.io/2001adarsh/jenkins-mcp-go:latest
Tags:
:latest— release mais recente:vX.Y.Z— fixado em um release específico:vX.Y.Z-amd64/:vX.Y.Z-arm64— por arquitetura (as tags sem sufixo acima são manifests multi-arquitetura;docker pullresolve a correta automaticamente)
A imagem é construída sobre gcr.io/distroless/static:nonroot — executa como usuário não-root, inclui raízes de CA para que HTTPS para o Jenkins funcione de imediato e tem menos de 20 MB compactada. Consulte a seção Configuração do cliente MCP via Docker para uma configuração do Claude Desktop baseada em docker run.
A partir do código-fonte
git clone https://github.com/2001adarsh/jenkins-mcp-go.git
cd jenkins-mcp-go
make build
./bin/jenkins-mcp -h 2>/dev/null || true # the server speaks MCP over stdio; -h prints nothing
Configuração
A configuração é lida do ambiente na inicialização. Não há arquivo de configuração nem flags de linha de comando — mantenha as credenciais fora dos argumentos do processo.
| Variável | Obrigatória | Padrão | Descrição |
|---|---|---|---|
JENKINS_URL | sim | — | URL base da instância do Jenkins, ex.: https://jenkins.example.com. |
JENKINS_USER | sim | — | Nome de usuário para autenticação HTTP Basic. |
JENKINS_API_TOKEN | sim | — | Token de API (não a senha). Gere um em /me/configure na sua interface do Jenkins. |
JENKINS_MCP_CACHE_DIR | não | $XDG_CACHE_HOME/jenkins-mcp (ou ~/.cache/jenkins-mcp) | Onde os logs de builds concluídas são armazenados em cache no disco. |
JENKINS_MCP_CACHE_MAX | não | 1073741824 (1 GiB) | Limite flexível do tamanho do cache em bytes. Remove primeiro os arquivos com mtime mais antigo. |
JENKINS_MCP_TIMEOUT | não | 90s | Timeout HTTP (duração Go: 30s, 2m, etc.). |
JENKINS_MCP_DEBUG | não | não definido | Quando definido com qualquer valor não vazio, emite uma linha em stderr por requisição Jenkins de saída e evento de cache. Consulte docs/DEBUGGING.md. |
JENKINS_MCP_READONLY | não | não definido | Quando verdadeiro (1/true/yes, sem diferenciar maiúsculas/minúsculas), suprime o registro de qualquer ferramenta que altere o estado do Jenkins. O modo ativo é registrado na inicialização. |
Nota —
JENKINS_API_TOKENdeve ser um token de API do Jenkins, não a senha da sua conta. No Jenkins, navegue até o menu do usuário → Configure → API Token → Add new Token.
Configuração do cliente MCP
O servidor fala MCP via stdio. Conecte-o adicionando uma entrada à configuração do servidor MCP do seu cliente.
Claude Desktop — ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) ou %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"jenkins": {
"command": "/usr/local/bin/jenkins-mcp",
"env": {
"JENKINS_URL": "https://jenkins.example.com",
"JENKINS_USER": "your-username",
"JENKINS_API_TOKEN": "your-api-token"
}
}
}
}
Claude Desktop via Docker — mesmo arquivo de configuração, nenhum binário no PATH necessário
{
"mcpServers": {
"jenkins": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "JENKINS_URL",
"-e", "JENKINS_USER",
"-e", "JENKINS_API_TOKEN",
"ghcr.io/2001adarsh/jenkins-mcp-go:latest"
],
"env": {
"JENKINS_URL": "https://jenkins.example.com",
"JENKINS_USER": "your-username",
"JENKINS_API_TOKEN": "your-api-token"
}
}
}
}
-i mantém o stdin aberto (MCP fala stdio); --rm limpa o contêiner após o Claude Desktop desconectar. O cache de logs de console fica dentro do contêiner por padrão, então é perdido na reinicialização — adicione -v "$HOME/.cache/jenkins-mcp:/home/nonroot/.cache/jenkins-mcp" e -e XDG_CACHE_HOME=/home/nonroot/.cache ao array args se quiser que o cache sobreviva entre sessões.
Claude Code (CLI)
claude mcp add jenkins /usr/local/bin/jenkins-mcp \
--env JENKINS_URL=https://jenkins.example.com \
--env JENKINS_USER=your-username \
--env JENKINS_API_TOKEN=your-api-token
Cursor / Continue / qualquer outro cliente MCP
Qualquer cliente que suporte servidores MCP stdio aceitará uma configuração da forma:
{
"command": "jenkins-mcp",
"args": [],
"env": {
"JENKINS_URL": "https://jenkins.example.com",
"JENKINS_USER": "your-username",
"JENKINS_API_TOKEN": "your-api-token"
}
}
Sessão de exemplo
Depois que o servidor estiver registrado, pergunte ao seu agente coisas como:
- "Quais jobs de teste de integração temos em
Builds/team?" → chamalist_jobscomfolder_path: "Builds/team",recursive: true,name_filter: "integration". - "Qual foi o resultado do build 86 de
Builds/team/integration-tests?" → chamaget_build_info. - "Mostre-me as últimas 200 linhas da execução mais recente de
nightly." → chamaget_console_logcomtail_lines: 200. - "Encontre todas as linhas que correspondem a
panic|fatalno build 4521 com cinco linhas de contexto." → chamasearch_console_logcompattern: "panic|fatal",context_lines: 5. - "O build 91 passou, mas o 92 falhou — o que mudou?"
→ chama
compare_buildscombuild_a: 91,build_b: 92. - "Quais testes em
Builds/team/integration-teststêm alternado entre passou e falhou recentemente?" → chamaget_flaky_candidates. - "Quais commits no build 86 tocaram algo em
internal/auth/?" → chamaget_scm_contextcompath_filter: "^internal/auth/". - "Quais specs Ginkgo falharam no build 92 e qual foi o primeiro erro que cada uma emitiu?"
→ chama
get_ginkgo_failure_summary. - "Armazene em cache o log completo do build 4521 para que eu possa fazer grep localmente."
→ chama
get_console_log_path; o agente então usa suas próprias ferramentasRead/Grep/Bashno caminho retornado.
Cache
Somente builds concluídos são armazenados em cache (o escritor exige o marcador Finished:
do Jenkins), e o cache é removido por LRU mtime quando excede
JENKINS_MCP_CACHE_MAX. Os arquivos ficam em JENKINS_MCP_CACHE_DIR.
Notas de segurança
- Sem eco de credenciais. O servidor nunca inclui credenciais na saída das ferramentas, mensagens de erro ou arquivos em cache.
- Limite do sistema de arquivos. Os nomes dos arquivos de cache são saneados; o diretório de cache é o único caminho em que o servidor grava.
Se você encontrar um problema de segurança, siga SECURITY.md em vez de abrir uma issue pública.
Desenvolvimento
make build / test / lint / fmt. Consulte CONTRIBUTING.md para o
guia completo do contribuidor e docs/DEBUGGING.md para saber como
exercitar o servidor localmente com o MCP Inspector.
Compatibilidade
- Go: 1.23+
- Jenkins: qualquer versão que exponha os endpoints padrão
/api/json,/consoleText,/wfapi/describe,/testReport/api/json. As ferramentas específicas de Pipeline exigem o plugin Pipeline. - MCP: usa
github.com/modelcontextprotocol/go-sdkv1.6+.
Alternativas
Como jenkins-mcp-go se compara a outras formas de expor o Jenkins a um LLM:
| Opção | Runtime | Modo somente leitura | Cache de log do console | Ferramentas Pipeline / JUnit / Ginkgo |
|---|---|---|---|---|
jenkins-mcp-go (este repositório) | Binário Go estático único | Sim, controlado por JENKINS_MCP_READONLY | Cache LRU em disco para builds concluídos | Respostas de primeira classe, pré-digeridas |
| Servidores Jenkins MCP baseados em Python | Interpretador Python + dependências | Varia por projeto | Normalmente nenhum — busca novamente a cada chamada | Geralmente passagem direta de /api/json cru |
| Gateways genéricos HTTP-para-MCP | Runtime Node / Python | O que o gateway impõe | Nenhum | Nenhum — o agente precisa analisar JSON cru |
Ferramentas diretas curl / shell do agente | Shell | Manual | Nenhum | Nenhum — o agente raciocina sobre texto cru |
Se você quer uma superfície pequena e previsível voltada para "o agente está depurando um build do Jenkins", este projeto é para você. Se você precisa de um proxy JSON genérico ou roteamento de credenciais multi-tenant, um gateway HTTP-MCP genérico é mais adequado.
FAQ
Como conecto o Jenkins ao Claude?
Instale o binário jenkins-mcp e adicione-o à configuração MCP do seu Claude Desktop ou
Claude Code com seu JENKINS_URL, JENKINS_USER e
JENKINS_API_TOKEN. Consulte Configuração do cliente MCP acima para os
exemplos exatos de JSON / CLI.
Isso funciona com Cursor, Continue ou Windsurf?
Sim. Qualquer cliente MCP que suporte servidores stdio aceitará a mesma
configuração command + env mostrada na seção Configuração do cliente MCP.
O servidor é somente leitura?
As leituras estão sempre ativas. As ferramentas de escrita (trigger_build, stop_build,
cancel_queue_item) são registradas por padrão, mas podem ser totalmente suprimidas
definindo JENKINS_MCP_READONLY=1 — o servidor então nunca registra uma
ferramenta de mutação, então um agente literalmente não pode chamar uma.
Preciso de um plugin Jenkins para usar isso?
Nenhum plugin extra é necessário para as ferramentas de leitura principais — elas acessam
endpoints padrão do Jenkins. As ferramentas específicas de Pipeline (get_pipeline_stages,
get_stage_log) exigem o plugin Pipeline, que a maioria das instalações do Jenkins
já possui.
O agente LLM pode fazer grep em um log de console de vários gigabytes?
Sim. Use get_console_log_path para forçar o cache do log completo de um
build concluído em disco; a ferramenta retorna um caminho local que o agente pode então Read,
Grep, ou Bash nativamente. O cache é removido por LRU e limitado por
JENKINS_MCP_CACHE_MAX.
Ele lida especificamente com falhas de teste Ginkgo?
Sim. get_ginkgo_failure_summary analisa o bloco Summarizing N Failure do Ginkgo e
superfície a primeira linha [ERROR] marcada com o nome de cada spec, além do
contexto ao redor — muito mais rápido do que pedir ao agente para escanear o log inteiro.
É seguro dar a um LLM acesso ao token da API do Jenkins?
O servidor usa o token da API de um único usuário do Jenkins (não uma senha), confinado
a um JENKINS_URL. Combine com JENKINS_MCP_READONLY=1 e um usuário Jenkins de privilégios mínimos
para o padrão mais seguro. Consulte SECURITY.md para o
modelo de ameaça completo.
Licença
MIT © Adarsh Singh