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.

Go Reference Go Report Card CI Release License: MIT


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 por JENKINS_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_path retorna o caminho em disco do log de uma build concluída para que o agente possa Read/Grep/Bash nativamente 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/json e o bloco Summarizing N Failure do 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

FerramentaFinalidade
health_checkValida 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_versionsLista 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_canVerifica 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_jobsEnumera 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_branchesEnumera 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_logExibe o final do /consoleText da build. Padrão: últimas 500 linhas; passe tail_lines: -1 para o log completo.
get_console_log_pathForç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_logBusca regex RE2 no log de console com janelas de contexto cientes do número da linha.
tail_running_buildFinal 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_infoResumo da build formatado: resultado, duração, parâmetros, conjunto de alterações.
get_build_environmentTrê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_contextHistó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_buildInforma 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_greenUne 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_buildsCompara 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_stagesLista os estágios de Pipeline Declarativo/Scripted via /wfapi/describe com status e duração.
get_stage_logObtém o log de um único estágio de pipeline via /execution/node/<id>/wfapi/log.
get_pipeline_scriptRetorna 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_reportResultados JUnit estruturados de /testReport/api/json, com casos com falha e início+fim dos stack traces.
get_flaky_candidatesClassifica 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_historyTendê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_nameLocaliza 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_failuresLevanta 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_buildsLista 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_summaryAnalisa o bloco Summarizing N Failure do Ginkgo e exibe o primeiro [ERROR] marcado com cada nome de spec.
list_nodesLista agentes/nós do Jenkins com status, contagens de executores, labels e resumos de monitoramento.
get_nodeDetalhe por nó: status, estado ocioso por executor, labels, dados completos de monitoramento.
list_queueLista itens pendentes da fila do Jenkins com o motivo do bloqueio de cada um.
cancel_queue_itemRemove um item pendente da fila por id. Mutante; suprimido quando JENKINS_MCP_READONLY está definido.
trigger_buildEnfileira uma build, opcionalmente com parâmetros; pode bloquear até que a build receba um número. Mutante.
stop_buildCancela 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 pull resolve 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ávelObrigatóriaPadrãoDescrição
JENKINS_URLsimURL base da instância do Jenkins, ex.: https://jenkins.example.com.
JENKINS_USERsimNome de usuário para autenticação HTTP Basic.
JENKINS_API_TOKENsimToken de API (não a senha). Gere um em /me/configure na sua interface do Jenkins.
JENKINS_MCP_CACHE_DIRnã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_MAXnão1073741824 (1 GiB)Limite flexível do tamanho do cache em bytes. Remove primeiro os arquivos com mtime mais antigo.
JENKINS_MCP_TIMEOUTnão90sTimeout HTTP (duração Go: 30s, 2m, etc.).
JENKINS_MCP_DEBUGnãonão definidoQuando 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_READONLYnãonão definidoQuando 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.

NotaJENKINS_API_TOKEN deve ser um token de API do Jenkins, não a senha da sua conta. No Jenkins, navegue até o menu do usuário → ConfigureAPI TokenAdd 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?" → chama list_jobs com folder_path: "Builds/team", recursive: true, name_filter: "integration".
  • "Qual foi o resultado do build 86 de Builds/team/integration-tests?" → chama get_build_info.
  • "Mostre-me as últimas 200 linhas da execução mais recente de nightly." → chama get_console_log com tail_lines: 200.
  • "Encontre todas as linhas que correspondem a panic|fatal no build 4521 com cinco linhas de contexto." → chama search_console_log com pattern: "panic|fatal", context_lines: 5.
  • "O build 91 passou, mas o 92 falhou — o que mudou?" → chama compare_builds com build_a: 91, build_b: 92.
  • "Quais testes em Builds/team/integration-tests têm alternado entre passou e falhou recentemente?" → chama get_flaky_candidates.
  • "Quais commits no build 86 tocaram algo em internal/auth/?" → chama get_scm_context com path_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 ferramentas Read/Grep/Bash no 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-sdk v1.6+.

Alternativas

Como jenkins-mcp-go se compara a outras formas de expor o Jenkins a um LLM:

OpçãoRuntimeModo somente leituraCache de log do consoleFerramentas Pipeline / JUnit / Ginkgo
jenkins-mcp-go (este repositório)Binário Go estático únicoSim, controlado por JENKINS_MCP_READONLYCache LRU em disco para builds concluídosRespostas de primeira classe, pré-digeridas
Servidores Jenkins MCP baseados em PythonInterpretador Python + dependênciasVaria por projetoNormalmente nenhum — busca novamente a cada chamadaGeralmente passagem direta de /api/json cru
Gateways genéricos HTTP-para-MCPRuntime Node / PythonO que o gateway impõeNenhumNenhum — o agente precisa analisar JSON cru
Ferramentas diretas curl / shell do agenteShellManualNenhumNenhum — 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