{"firstRelease":"2025-06-18T07:18:27.67Z","wikiUrl":"https://github.com/jenkinsci/mcp-server-plugin","buildDate":"2026-11-06","categories":[],"dependencies":[{"name":"commons-lang3-api","title":"commons-lang3 v3.x Jenkins API","optional":false,"version":"3.20.0-109.ve43756e2d2b_4","implied":false},{"name":"jackson3-api","title":"Jackson 3 API","optional":false,"version":"3.2.1-92.vd25c2e23c180","implied":false},{"name":"workflow-cps","title":"Pipeline: Groovy","optional":true,"version":"4360.v2020e8819a_d6","implied":false},{"name":"workflow-job","title":"Pipeline: Job","optional":true,"version":"1571.1580.v18e46842c125","implied":false},{"name":"git","title":"Git","optional":true,"version":"5.10.1","implied":false},{"name":"junit","title":"JUnit","optional":true,"version":"1403.vd9d1413fd205","implied":false}],"maintainers":[{"id":"topikachu","name":"Yi Gong","email":null},{"id":"olamy","name":"Olivier Lamy","email":null}],"excerpt":"The <a href=\"https://modelcontextprotocol.io/\" target=\"_blank\" rel=\"noopener nofollow noreferrer\">MCP (Model Context Protocol)</a> Server Plugin for Jenkins implements the server-side component of the Model Context Protocol. This plugin enables Jenkins to act as an MCP server, providing context, tools, and capabilities to MCP clients, such as LLM-powered applications or IDEs.","gav":"io.jenkins.plugins:mcp-server:0.225.vea_39b_6ff2a_16","labels":["ai","mcp"],"name":"mcp-server","previousTimestamp":"2026-10-28T00:08:29.00Z","previousVersion":"0.222.v9d40a_8d624e4","releaseTimestamp":"2026-11-06T11:35:56.00Z","requiredCore":"2.541.3","scm":{"issues":null,"link":"https://github.com/jenkinsci/mcp-server-plugin","inLatestRelease":null,"sinceLatestRelease":null,"pullRequests":null},"sha1":"E+Gfv77i/NgFyZWAmhNYkfbaTIA=","stats":{"installations":[{"timestamp":1748736000000,"total":32},{"timestamp":1751328000000,"total":128},{"timestamp":1754006400000,"total":307},{"timestamp":1756684800000,"total":420},{"timestamp":1759276800000,"total":508},{"timestamp":1761955200000,"total":647},{"timestamp":1764547200000,"total":751},{"timestamp":1767225600000,"total":972},{"timestamp":1769904000000,"total":1240}],"installationsPercentage":[{"timestamp":1748736000000,"percentage":0.011836508},{"timestamp":1751328000000,"percentage":0.048103843},{"timestamp":1754006400000,"percentage":0.113375336},{"timestamp":1756684800000,"percentage":0.15666673},{"timestamp":1759276800000,"percentage":0.20002362},{"timestamp":1761955200000,"percentage":0.2554586},{"timestamp":1764547200000,"percentage":0.31248438},{"timestamp":1767225600000,"percentage":0.3720389},{"timestamp":1769904000000,"percentage":0.499732}],"installationsPerVersion":[{"version":"0.102.vf677b_eb_da_e4f","total":29},{"version":"0.104.v935c459ca_ee2","total":10},{"version":"0.109.vea_d3ec3083f1","total":4},{"version":"0.116.v335308141e4e","total":479},{"version":"0.119.v479294b_419a_7","total":18},{"version":"0.130.v7837b_2a_5447e","total":21},{"version":"0.138.v7c6a_22ee9160","total":25},{"version":"0.148.v6b_c057f27738","total":1},{"version":"0.149.ve5cd2f59de01","total":426},{"version":"0.158.v8e18e64dd93c","total":26},{"version":"0.16.vc9132432728d","total":4},{"version":"0.17.v941ed9da_c023","total":8},{"version":"0.25.v59ca_c2d5ffc5","total":4},{"version":"0.26.v4a_0d810a_7f71","total":1},{"version":"0.27.v4034b_d4c4cb_5","total":4},{"version":"0.33.vecd845512255","total":6},{"version":"0.37.v5d2d8c089e8b_","total":10},{"version":"0.46.v43ff45cf7fe5","total":15},{"version":"0.57.vc17d46a_5d10b_","total":113},{"version":"0.77.veb_c7b_a_b_f0445","total":7},{"version":"0.86.v7d3355e6a_a_18","total":2},{"version":"0.88.vde1b_2e64212c","total":3},{"version":"0.90.v46fb_a_0b_0e4a_3","total":3},{"version":"0.92.v575c7c143c44","total":10},{"version":"0.95.vb_c1a_8b_ca_216f","total":11}],"installationsPercentagePerVersion":[{"version":"0.102.vf677b_eb_da_e4f","percentage":0.011687281},{"version":"0.104.v935c459ca_ee2","percentage":0.004030097},{"version":"0.109.vea_d3ec3083f1","percentage":0.0016120387},{"version":"0.116.v335308141e4e","percentage":0.19304164},{"version":"0.119.v479294b_419a_7","percentage":0.007254174},{"version":"0.130.v7837b_2a_5447e","percentage":0.008463203},{"version":"0.138.v7c6a_22ee9160","percentage":0.010075242},{"version":"0.148.v6b_c057f27738","percentage":4.0300968E-4},{"version":"0.149.ve5cd2f59de01","percentage":0.17168212},{"version":"0.158.v8e18e64dd93c","percentage":0.010478252},{"version":"0.16.vc9132432728d","percentage":0.0016120387},{"version":"0.17.v941ed9da_c023","percentage":0.0032240774},{"version":"0.25.v59ca_c2d5ffc5","percentage":0.0016120387},{"version":"0.26.v4a_0d810a_7f71","percentage":4.0300968E-4},{"version":"0.27.v4034b_d4c4cb_5","percentage":0.0016120387},{"version":"0.33.vecd845512255","percentage":0.002418058},{"version":"0.37.v5d2d8c089e8b_","percentage":0.004030097},{"version":"0.46.v43ff45cf7fe5","percentage":0.006045145},{"version":"0.57.vc17d46a_5d10b_","percentage":0.045540094},{"version":"0.77.veb_c7b_a_b_f0445","percentage":0.0028210678},{"version":"0.86.v7d3355e6a_a_18","percentage":8.0601935E-4},{"version":"0.88.vde1b_2e64212c","percentage":0.001209029},{"version":"0.90.v46fb_a_0b_0e4a_3","percentage":0.001209029},{"version":"0.92.v575c7c143c44","percentage":0.004030097},{"version":"0.95.vb_c1a_8b_ca_216f","percentage":0.0044331066}],"currentInstalls":1240,"trend":1276},"title":"MCP Server","url":"https://updates.jenkins.io/download/plugins/mcp-server/0.225.vea_39b_6ff2a_16/mcp-server.hpi","version":"0.225.vea_39b_6ff2a_16","securityWarnings":[{"versions":[{"firstVersion":null,"lastVersion":"0.84.v50ca_24ef83f2"}],"id":"SECURITY-3622","message":"Missing permission checks","url":"https://www.jenkins.io/security/advisory/2025-10-29/#SECURITY-3622","active":false},{"versions":[{"firstVersion":null,"lastVersion":"0.177.v629fdb_2557fe"}],"id":"SECURITY-3759","message":"Missing permission check allows reading Pipeline replay scripts","url":"https://www.jenkins.io/security/advisory/2026-06-24/#SECURITY-3759","active":false}],"wiki":{"content":"<div id=\"readme\" class=\"md\" data-path=\"README.md\">\n <article class=\"markdown-body entry-content container-lg\" itemprop=\"text\">\n  <div class=\"markdown-heading\" dir=\"auto\">\n   <a id=\"user-content-mcp-server-plugin-for-jenkins\" class=\"anchor\" aria-label=\"Permalink: MCP Server Plugin for Jenkins\" href=\"#mcp-server-plugin-for-jenkins\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP (Model Context Protocol) Server Plugin for Jenkins implements the server-side component of the Model Context Protocol. This plugin enables Jenkins to act as an MCP server, providing context, tools, and capabilities to MCP clients, such as LLM-powered applications or IDEs.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h2 class=\"heading-element\" dir=\"auto\">Features</h2>\n   <a id=\"user-content-features\" class=\"anchor\" aria-label=\"Permalink: Features\" href=\"#features\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><strong>MCP Server Implementation</strong>: Implements the server-side of the Model Context Protocol.</li> \n   <li><strong>Jenkins Integration</strong>: Exposes Jenkins functionalities as MCP tools and resources.</li> \n   <li><strong>Extensible Architecture</strong>: Allows easy extension of MCP capabilities through the <code>McpServerExtension</code> interface.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h2 class=\"heading-element\" dir=\"auto\">Key Components</h2>\n   <a id=\"user-content-key-components\" class=\"anchor\" aria-label=\"Permalink: Key Components\" href=\"#key-components\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ol dir=\"auto\"> \n   <li><strong>Endpoint</strong>: The main entry point for MCP communication, handling MCP transport connections and message routing.</li> \n   <li><strong>DefaultMcpServer</strong>: Implements <code>McpServerExtension</code>, providing default tools for interacting with Jenkins jobs and builds.</li> \n   <li><strong>McpToolWrapper</strong>: Wraps Java methods as MCP tools, handling parameter parsing and result formatting.</li> \n   <li><strong>McpServerExtension</strong>: Interface for extending MCP server capabilities.</li> \n  </ol> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h2 class=\"heading-element\" dir=\"auto\">MCP SDK Version</h2>\n   <a id=\"user-content-mcp-sdk-version\" class=\"anchor\" aria-label=\"Permalink: MCP SDK Version\" href=\"#mcp-sdk-version\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">This MCP Server is based on the MCP Java SDK version 0.17.2, which implements the MCP specification version 2025-06-18.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h2 class=\"heading-element\" dir=\"auto\">Getting Started</h2>\n   <a id=\"user-content-getting-started\" class=\"anchor\" aria-label=\"Permalink: Getting Started\" href=\"#getting-started\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Configuration</h3>\n   <a id=\"user-content-configuration\" class=\"anchor\" aria-label=\"Permalink: Configuration\" href=\"#configuration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server plugin automatically sets up necessary endpoints and tools upon installation, requiring no additional configuration.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">System properties</h4>\n   <a id=\"user-content-system-properties\" class=\"anchor\" aria-label=\"Permalink: System properties\" href=\"#system-properties\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The following system properties can be used to configure the MCP Server plugin:</p> \n  <ul dir=\"auto\"> \n   <li>hard limit on max number of log lines to return with <code>io.jenkins.plugins.mcp.server.extensions.BuildLogsExtension.limit.max=10000</code> (default 10000)</li> \n   <li>longest <code>searchBuildLog</code> pattern accepted with <code>io.jenkins.plugins.mcp.server.extensions.BuildLogsExtension.pattern.maxLength=1000</code> (default 1000 characters)</li> \n   <li>how many characters one <code>searchBuildLog</code> regex may read from a single log line before the search is abandoned, with <code>io.jenkins.plugins.mcp.server.extensions.BuildLogsExtension.pattern.maxReadsPerLine=10000000</code> (default 10,000,000)</li> \n   <li>disable stateless endpoint with <code>io.jenkins.plugins.mcp.server.Endpoint.disableMcpStateless=true</code> (default false)</li> \n   <li>disable SSE endpoint with <code>io.jenkins.plugins.mcp.server.Endpoint.disableMcpSse=true</code> (default false)</li> \n   <li>disable streamable HTTP endpoint with <code>io.jenkins.plugins.mcp.server.Endpoint.disableMcpStreamable=true</code> (default false)</li> \n   <li>allow anonymous MCP clients to skip the CSRF crumb with <code>io.jenkins.plugins.mcp.server.Endpoint.allowUnauthenticatedMcp=true</code> (default false)</li> \n   <li>reclaim idle Streamable HTTP sessions with <code>io.jenkins.plugins.mcp.server.Endpoint.sessionSweepInterval=1800</code> (seconds, default 1800, 0 disables)</li> \n  </ul> \n  <div class=\"markdown-alert markdown-alert-warning\" dir=\"auto\">\n   <p class=\"markdown-alert-title\" dir=\"auto\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-alert mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n    </svg>Warning</p>\n   <p dir=\"auto\"><code>io.jenkins.plugins.mcp.server.Endpoint.allowUnauthenticatedMcp=true</code> weakens CSRF protection. MCP POSTs that send an <code>Authorization</code> header are exempt from the crumb, because a page on another site cannot add that header. Anonymous and session-cookie clients are not exempt unless this property is set. With it on, those POSTs rely on the Origin check, which allows a missing <code>Origin</code> and does nothing when the Jenkins root URL is unset. Leave the property <code>false</code> on any controller that browsers or anonymous users can reach. <code>mvn hpi:run</code> sets it so a local development controller accepts an MCP client without a crumb.</p> \n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Search pattern cost</h4>\n   <a id=\"user-content-search-pattern-cost\" class=\"anchor\" aria-label=\"Permalink: Search pattern cost\" href=\"#search-pattern-cost\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\"><code>searchBuildLog</code> runs your regular expression against every line of a build log, and some patterns cost far more than their length suggests, because Java's regex engine backtracks.</p> \n  <p dir=\"auto\">Each match therefore gets a budget of character reads, and a search that runs past it stops with an error instead of carrying on. The budget is generous on purpose, so you are unlikely to meet it. If you do, simplify the pattern or search for plain text with <code>useRegex=false</code>, which has no budget.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Origin header validation</h4>\n   <a id=\"user-content-origin-header-validation\" class=\"anchor\" aria-label=\"Permalink: Origin header validation\" href=\"#origin-header-validation\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP specification marks validating the <code>Origin</code> header of incoming requests as a <code>MUST</code>.</p> \n  <p dir=\"auto\">By default, when an <code>Origin</code> header is present it is validated against the configured Jenkins root URL (<code>io.jenkins.plugins.mcp.server.Endpoint.requireOriginMatch</code> defaults to <code>true</code>). Requests that do not send an <code>Origin</code> header are still allowed, so AI agents that omit it keep working (<code>io.jenkins.plugins.mcp.server.Endpoint.requireOriginHeader</code> defaults to <code>false</code>).</p> \n  <ul dir=\"auto\"> \n   <li>To also reject requests that omit the <code>Origin</code> header, set <code>io.jenkins.plugins.mcp.server.Endpoint.requireOriginHeader=true</code>.</li> \n   <li>To disable Origin matching entirely (not recommended), set <code>io.jenkins.plugins.mcp.server.Endpoint.requireOriginMatch=false</code>.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Connection Resilience</h3>\n   <a id=\"user-content-connection-resilience\" class=\"anchor\" aria-label=\"Permalink: Connection Resilience\" href=\"#connection-resilience\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server plugin includes several features to improve connection reliability.</p> \n  <p dir=\"auto\">The keep-alive and timeout tuning described below primarily concern the <strong>SSE</strong> transport (<code>/mcp-server/sse</code>), which holds a single long-lived server→client connection open and is therefore sensitive to idle timeouts in Jenkins, proxies, and load balancers. If you use <strong>Streamable HTTP</strong> (<code>/mcp-server/mcp</code>) with the usual request/response pattern, you are unlikely to need any of it (see <a href=\"#transport-recommendation\">Transport Recommendation</a>). The health, metrics, and graceful-shutdown features apply to all transports.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Keep-Alive Messages</h4>\n   <a id=\"user-content-keep-alive-messages\" class=\"anchor\" aria-label=\"Permalink: Keep-Alive Messages\" href=\"#keep-alive-messages\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">For the <strong>SSE</strong> transport, the server sends periodic keep-alive pings over the open connection to detect broken connections and to stop idle timeouts (in Jenkins, proxies, or load balancers) from closing it. By default, pings are sent every 30 seconds.</p> \n  <p dir=\"auto\">You can configure this interval with the system property:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"io.jenkins.plugins.mcp.server.Endpoint.keepAliveInterval=30\">\n   <pre class=\"notranslate\"><code>io.jenkins.plugins.mcp.server.Endpoint.keepAliveInterval=30\n</code></pre>\n  </div> \n  <p dir=\"auto\">Set to <code>0</code> to disable keep-alive messages (not recommended for SSE).</p> \n  <div class=\"markdown-alert markdown-alert-note\" dir=\"auto\">\n   <p class=\"markdown-alert-title\" dir=\"auto\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-info mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n    </svg>Note</p>\n   <p dir=\"auto\">A ping is only delivered when there is an open server→client stream. SSE always has one. Streamable HTTP only has one while the client keeps a long-lived GET stream open; for a plain POST request/response client there is no stream to ping, so this setting has no effect. Those clients are covered by <a href=\"#idle-session-cleanup\">Idle Session Cleanup</a> instead.</p> \n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Idle Session Cleanup</h4>\n   <a id=\"user-content-idle-session-cleanup\" class=\"anchor\" aria-label=\"Permalink: Idle Session Cleanup\" href=\"#idle-session-cleanup\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">A <strong>Streamable HTTP</strong> session outlives the connection it was created on, because the protocol lets a client reconnect to a session it was disconnected from. A client that disappears without sending <code>DELETE /mcp-server/mcp</code> therefore leaves its session behind, along with the socket and servlet async context behind it. Left alone, those pile up until the controller runs out of file descriptors.</p> \n  <p dir=\"auto\">The server reclaims them: a session with no open stream that has gone a full interval without a request is closed and dropped. The interval defaults to 30 minutes, so a stranded session lives for 30 to 60 minutes.</p> \n  <p dir=\"auto\">You can configure it with the system property:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"io.jenkins.plugins.mcp.server.Endpoint.sessionSweepInterval=1800\">\n   <pre class=\"notranslate\"><code>io.jenkins.plugins.mcp.server.Endpoint.sessionSweepInterval=1800\n</code></pre>\n  </div> \n  <p dir=\"auto\">Set to <code>0</code> to keep sessions until the client deletes them or Jenkins restarts. That is the old behaviour, and it leaks.</p> \n  <p dir=\"auto\">A client whose session was reclaimed gets <code>404</code> on its next request and should start a new one with <code>initialize</code>, which is what the protocol asks of it. To watch the cleanup, add a Jenkins log recorder at <code>DEBUG</code> on <code>io.modelcontextprotocol.server.transport.HttpServletStreamableServerTransportProvider</code> and look for <code>Evicting idle session</code>, or read <code>streamableSessionsActive</code> from the <a href=\"#metrics-endpoint\">metrics endpoint</a>.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Health Endpoint</h4>\n   <a id=\"user-content-health-endpoint\" class=\"anchor\" aria-label=\"Permalink: Health Endpoint\" href=\"#health-endpoint\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">A lightweight MCP-specific health endpoint is available for connection monitoring at:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"<jenkins-url>/mcp-health\">\n   <pre class=\"notranslate\"><code>&lt;jenkins-url&gt;/mcp-health\n</code></pre>\n  </div> \n  <p dir=\"auto\">This endpoint:</p> \n  <ul dir=\"auto\"> \n   <li>Returns MCP server status and active connection counts</li> \n   <li>Requires no authentication for maximum accessibility</li> \n   <li>Returns immediately without MCP protocol overhead</li> \n   <li>Returns HTTP 200 when healthy, HTTP 503 during shutdown</li> \n   <li>Includes <code>Retry-After</code> header during shutdown</li> \n  </ul> \n  <p dir=\"auto\">Response format:</p> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcpServerStatus&quot;: &quot;ok&quot;,\n  &quot;activeConnections&quot;: 5,\n  &quot;shuttingDown&quot;: false,\n  &quot;timestamp&quot;: &quot;2025-01-28T10:30:00Z&quot;\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"mcpServerStatus\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>ok<span class=\"pl-pds\">\"</span></span>,\n  <span class=\"pl-ent\">\"activeConnections\"</span>: <span class=\"pl-c1\">5</span>,\n  <span class=\"pl-ent\">\"shuttingDown\"</span>: <span class=\"pl-c1\">false</span>,\n  <span class=\"pl-ent\">\"timestamp\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>2025-01-28T10:30:00Z<span class=\"pl-pds\">\"</span></span>\n}</pre>\n  </div> \n  <p dir=\"auto\"><strong>Recommended client usage:</strong></p> \n  <ul dir=\"auto\"> \n   <li>Poll the health endpoint periodically (e.g., every 10-30 seconds)</li> \n   <li>When the endpoint returns 503 or becomes unreachable, prepare for reconnection</li> \n   <li>Use the <code>Retry-After</code> header value when available</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Metrics Endpoint</h4>\n   <a id=\"user-content-metrics-endpoint\" class=\"anchor\" aria-label=\"Permalink: Metrics Endpoint\" href=\"#metrics-endpoint\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">A metrics endpoint is available for monitoring connection statistics at:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"<jenkins-url>/mcp-server/metrics\">\n   <pre class=\"notranslate\"><code>&lt;jenkins-url&gt;/mcp-server/metrics\n</code></pre>\n  </div> \n  <p dir=\"auto\">This endpoint requires authentication (standard Jenkins permissions) and provides:</p> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;sseConnectionsTotal&quot;: 42,\n  &quot;sseConnectionsActive&quot;: 3,\n  &quot;streamableRequestsTotal&quot;: 150,\n  &quot;streamableSessionsActive&quot;: 4,\n  &quot;connectionErrorsTotal&quot;: 2,\n  &quot;uptimeSeconds&quot;: 3600,\n  &quot;startTime&quot;: &quot;2025-01-28T10:00:00Z&quot;\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"sseConnectionsTotal\"</span>: <span class=\"pl-c1\">42</span>,\n  <span class=\"pl-ent\">\"sseConnectionsActive\"</span>: <span class=\"pl-c1\">3</span>,\n  <span class=\"pl-ent\">\"streamableRequestsTotal\"</span>: <span class=\"pl-c1\">150</span>,\n  <span class=\"pl-ent\">\"streamableSessionsActive\"</span>: <span class=\"pl-c1\">4</span>,\n  <span class=\"pl-ent\">\"connectionErrorsTotal\"</span>: <span class=\"pl-c1\">2</span>,\n  <span class=\"pl-ent\">\"uptimeSeconds\"</span>: <span class=\"pl-c1\">3600</span>,\n  <span class=\"pl-ent\">\"startTime\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>2025-01-28T10:00:00Z<span class=\"pl-pds\">\"</span></span>\n}</pre>\n  </div> \n  <p dir=\"auto\"><code>streamableSessionsActive</code> is the number of Streamable HTTP sessions the server is currently holding. It is left out when the streamable endpoint is disabled or has not served a request yet.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Graceful Shutdown</h4>\n   <a id=\"user-content-graceful-shutdown\" class=\"anchor\" aria-label=\"Permalink: Graceful Shutdown\" href=\"#graceful-shutdown\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">When Jenkins shuts down, the health endpoint will return <code>503 Service Unavailable</code> with a brief grace period before full termination. This allows clients to detect the shutdown and prepare for reconnection.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Transport Recommendation</h4>\n   <a id=\"user-content-transport-recommendation\" class=\"anchor\" aria-label=\"Permalink: Transport Recommendation\" href=\"#transport-recommendation\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">For better connection reliability, we recommend using <strong>Streamable HTTP</strong> (<code>/mcp-server/mcp</code>) instead of <strong>SSE</strong> (<code>/mcp-server/sse</code>). Streamable HTTP handles connection issues more gracefully and is the preferred transport for most MCP clients.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Production Deployment</h4>\n   <a id=\"user-content-production-deployment\" class=\"anchor\" aria-label=\"Permalink: Production Deployment\" href=\"#production-deployment\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">When deploying the <strong>SSE</strong> transport behind a reverse proxy or in production environments, configure the timeout settings below so the long-lived connection is not dropped prematurely. Streamable HTTP users generally don't need this (see the note at the end of this section).</p> \n  <p dir=\"auto\"><strong>Jenkins/Jetty Configuration (SSE)</strong></p> \n  <p dir=\"auto\">Jenkins uses Winstone (embedded Jetty) which defaults <code>httpKeepAliveTimeout</code> to 30 seconds. Since MCP keep-alive pings are also sent every 30 seconds, this creates a race condition where Jetty may close the SSE connection before the next ping arrives.</p> \n  <p dir=\"auto\">Add this argument to your Jenkins startup command:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"--httpKeepAliveTimeout=600000\">\n   <pre class=\"notranslate\"><code>--httpKeepAliveTimeout=600000\n</code></pre>\n  </div> \n  <p dir=\"auto\">For Docker deployments, add to your docker-compose.yml:</p> \n  <div class=\"highlight highlight-source-yaml notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"services:\n  jenkins:\n    image: jenkins/jenkins:lts\n    command: [&quot;--httpKeepAliveTimeout=600000&quot;]\">\n   <pre><span class=\"pl-ent\">services</span>:\n  <span class=\"pl-ent\">jenkins</span>:\n    <span class=\"pl-ent\">image</span>: <span class=\"pl-s\">jenkins/jenkins:lts</span>\n    <span class=\"pl-ent\">command</span>: <span class=\"pl-s\">[\"--httpKeepAliveTimeout=600000\"]</span></pre>\n  </div> \n  <p dir=\"auto\"><strong>Reverse Proxy Configuration (Nginx)</strong></p> \n  <p dir=\"auto\">For Nginx, extend timeouts for the MCP endpoints. This keeps SSE connections from being closed while idle:</p> \n  <div class=\"highlight highlight-source-nginx notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"location ~ ^/(mcp-server|mcp-health)/ {\n    proxy_pass http://jenkins;\n    proxy_http_version 1.1;\n    proxy_request_buffering off;\n    proxy_buffering off;\n    proxy_set_header Connection &quot;&quot;;\n    proxy_read_timeout 600s;\n    proxy_send_timeout 600s;\n}\">\n   <pre><span class=\"pl-c1\">location</span> <span class=\"pl-sr\">~</span> ^/<span class=\"pl-c1\">(</span>mcp-<span class=\"pl-c1\">server</span>|mcp-health<span class=\"pl-c1\">)</span>/ <span class=\"pl-c1\">{</span>\n    <span class=\"pl-c1\">proxy_pass</span> <span class=\"pl-c1\">http</span>://jenkins<span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_http_version</span> 1.1<span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_request_buffering</span> off<span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_buffering</span> off<span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_set_header</span> Connection <span class=\"pl-s\">\"\"</span><span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_read_timeout</span> <span class=\"pl-c1\">600s</span><span class=\"pl-c1\">;</span>\n    <span class=\"pl-c1\">proxy_send_timeout</span> <span class=\"pl-c1\">600s</span><span class=\"pl-c1\">;</span>\n<span class=\"pl-c1\">}</span></pre>\n  </div> \n  <div class=\"markdown-alert markdown-alert-note\" dir=\"auto\">\n   <p class=\"markdown-alert-title\" dir=\"auto\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-info mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n    </svg>Note</p>\n   <p dir=\"auto\">The one timeout that can also affect <strong>Streamable HTTP</strong> is <code>proxy_read_timeout</code>: a single long-running tool call (for example a slow <code>triggerBuild</code>) can exceed a short default and return <code>504 Gateway Timeout</code>. Raising <code>proxy_read_timeout</code> as shown above prevents that regardless of transport. The <code>httpKeepAliveTimeout</code> race condition above is SSE-only.</p> \n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Transport Endpoints</h4>\n   <a id=\"user-content-transport-endpoints\" class=\"anchor\" aria-label=\"Permalink: Transport Endpoints\" href=\"#transport-endpoints\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server plugin provides three transport endpoints, all enabled by default:</p> \n  <markdown-accessiblity-table>\n   <table> \n    <thead> \n     <tr> \n      <th>Transport</th> \n      <th>Endpoint</th> \n      <th>Description</th> \n     </tr> \n    </thead> \n    <tbody> \n     <tr> \n      <td><strong>SSE</strong></td> \n      <td><code>/mcp-server/sse</code> + <code>/mcp-server/message</code></td> \n      <td>Server-Sent Events transport with session management</td> \n     </tr> \n     <tr> \n      <td><strong>Streamable HTTP</strong></td> \n      <td><code>/mcp-server/mcp</code></td> \n      <td>Streamable HTTP transport with session management</td> \n     </tr> \n     <tr> \n      <td><strong>Stateless</strong></td> \n      <td><code>/mcp-server/stateless</code></td> \n      <td>Stateless HTTP transport without session management</td> \n     </tr> \n    </tbody> \n   </table>\n  </markdown-accessiblity-table> \n  <p dir=\"auto\">Each transport can be disabled independently using system properties:</p> \n  <div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpSse=true\n-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpStreamable=true\n-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpStateless=true\">\n   <pre class=\"notranslate\"><code>-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpSse=true\n-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpStreamable=true\n-Dio.jenkins.plugins.mcp.server.Endpoint.disableMcpStateless=true\n</code></pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h5 class=\"heading-element\" dir=\"auto\">When to use Stateless transport</h5>\n   <a id=\"user-content-when-to-use-stateless-transport\" class=\"anchor\" aria-label=\"Permalink: When to use Stateless transport\" href=\"#when-to-use-stateless-transport\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The stateless endpoint (<code>/mcp-server/stateless</code>) is useful for:</p> \n  <ul dir=\"auto\"> \n   <li>Simple deployments where session management overhead is not needed</li> \n   <li>Environments where clients make independent requests without maintaining a persistent connection</li> \n   <li>Testing and debugging scenarios</li> \n   <li>Clients that don't support session-based protocols</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h2 class=\"heading-element\" dir=\"auto\">Usage</h2>\n   <a id=\"user-content-usage\" class=\"anchor\" aria-label=\"Permalink: Usage\" href=\"#usage\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Connecting to the MCP Server</h3>\n   <a id=\"user-content-connecting-to-the-mcp-server\" class=\"anchor\" aria-label=\"Permalink: Connecting to the MCP Server\" href=\"#connecting-to-the-mcp-server\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">MCP clients can connect to the server using:</p> \n  <ul dir=\"auto\"> \n   <li>Streamable HTTP Endpoint: <code>&lt;jenkins-url&gt;/mcp-server/mcp</code></li> \n   <li>SSE Endpoint: <code>&lt;jenkins-url&gt;/mcp-server/sse</code></li> \n   <li>Message Endpoint: <code>&lt;jenkins-url&gt;/mcp-server/message</code></li> \n   <li>Stateless Endpoint: <code>&lt;jenkins-url&gt;/mcp-server/stateless</code></li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Authentication and Credentials</h3>\n   <a id=\"user-content-authentication-and-credentials\" class=\"anchor\" aria-label=\"Permalink: Authentication and Credentials\" href=\"#authentication-and-credentials\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server Plugin requires the same credentials as the Jenkins instance it's running on. To authenticate your MCP queries:</p> \n  <ol dir=\"auto\"> \n   <li><strong>Jenkins API Token</strong>: Generate an API token from your Jenkins user account.</li> \n   <li><strong>Basic Authentication</strong>: Use the API token in the HTTP Basic Authentication header.</li> \n  </ol> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Generate a personal access token</h4>\n   <a id=\"user-content-generate-a-personal-access-token\" class=\"anchor\" aria-label=\"Permalink: Generate a personal access token\" href=\"#generate-a-personal-access-token\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">To generate a personal access token:</p> \n  <ul dir=\"auto\"> \n   <li>Sign in to Jenkins.</li> \n   <li>Select your user icon in the upper-right corner, and then select <code>Security</code>.</li> \n   <li>Select <code>Add new token</code>.</li> \n   <li>Enter a name to distinguish the token, and then select <code>Generate</code>.</li> \n   <li>Copy the token and store it in a secure location for later use.</li> \n  </ul> \n  <div class=\"markdown-alert markdown-alert-warning\" dir=\"auto\">\n   <p class=\"markdown-alert-title\" dir=\"auto\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-alert mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\"></path>\n    </svg>Warning</p>\n   <p dir=\"auto\">Once you leave the page, you cannot view or copy the token again.</p> \n  </div> \n  <ul dir=\"auto\"> \n   <li>Select <code>Done</code> to add the token.</li> \n   <li>Select <code>Save</code> to save your changes.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Encode credentials for HTTP basic authentication</h4>\n   <a id=\"user-content-encode-credentials-for-http-basic-authentication\" class=\"anchor\" aria-label=\"Permalink: Encode credentials for HTTP basic authentication\" href=\"#encode-credentials-for-http-basic-authentication\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">Use basic HTTP authentication with the MCP agent by encoding it with the personal access token.</p> \n  <p dir=\"auto\">To encode credentials on Linux, macOS, or Windows:</p> \n  <p dir=\"auto\">Open a terminal and run the following command, replacing <code>&lt;username&gt;</code> and <code>&lt;token&gt;</code> with your actual username and the personal access token you generated in Jenkins</p> \n  <ul dir=\"auto\"> \n   <li>Linux or macOS</li> \n  </ul> \n  <div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"echo -n &quot;<username>:<token>&quot; | base64\">\n   <pre><span class=\"pl-c1\">echo</span> -n <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>&lt;username&gt;:&lt;token&gt;<span class=\"pl-pds\">\"</span></span> <span class=\"pl-k\">|</span> base64</pre>\n  </div> \n  <ul dir=\"auto\"> \n   <li>Windows (PowerShell)</li> \n  </ul> \n  <div class=\"highlight highlight-source-powershell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(&quot;<username>:<token>&quot;))\">\n   <pre>[<span class=\"pl-k\">Convert</span>]::ToBase64String([<span class=\"pl-k\">Text.Encoding</span>]::UTF8.GetBytes(<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>&lt;username&gt;:&lt;token&gt;<span class=\"pl-pds\">\"</span></span>))</pre>\n  </div> \n  <p dir=\"auto\">if successful, the Base64-encoded credential is output, similar to the following:</p> \n  <div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"dXNlcm5hbWU6dG9rZW4=\">\n   <pre>dXNlcm5hbWU6dG9rZW4=</pre>\n  </div> \n  <p dir=\"auto\">Store the encoded credential in a secure location for later use.</p> \n  <div class=\"markdown-alert markdown-alert-note\" dir=\"auto\">\n   <p class=\"markdown-alert-title\" dir=\"auto\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-info mr-2\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path>\n    </svg>Note</p>\n   <p dir=\"auto\">Base64 encoding is not encryption. Anyone with access to the encoded string can decode it and obtain your credentials. Always protect the encoded credentials as if they are the original username and token.</p> \n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Example Client Configurations</h3>\n   <a id=\"user-content-example-client-configurations\" class=\"anchor\" aria-label=\"Permalink: Example Client Configurations\" href=\"#example-client-configurations\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Cline Configuration</h4>\n   <a id=\"user-content-cline-configuration\" class=\"anchor\" aria-label=\"Permalink: Cline Configuration\" href=\"#cline-configuration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcpServers&quot;: {\n    &quot;jenkins&quot;: {\n      &quot;autoApprove&quot;: [\n        \n      ],\n      &quot;disabled&quot;: false,\n      &quot;timeout&quot;: 60,\n      &quot;type&quot;: &quot;streamableHttp&quot;,\n      &quot;url&quot;: &quot;https://jenkins-host/mcp-server/mcp&quot;,\n      &quot;headers&quot;: {\n        &quot;Authorization&quot;: &quot;Basic <user:token base64>&quot;\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"mcpServers\"</span>: {\n    <span class=\"pl-ent\">\"jenkins\"</span>: {\n      <span class=\"pl-ent\">\"autoApprove\"</span>: [\n        \n      ],\n      <span class=\"pl-ent\">\"disabled\"</span>: <span class=\"pl-c1\">false</span>,\n      <span class=\"pl-ent\">\"timeout\"</span>: <span class=\"pl-c1\">60</span>,\n      <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>streamableHttp<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"url\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://jenkins-host/mcp-server/mcp<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"headers\"</span>: {\n        <span class=\"pl-ent\">\"Authorization\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n      }\n    }\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Copilot Configuration</h4>\n   <a id=\"user-content-copilot-configuration\" class=\"anchor\" aria-label=\"Permalink: Copilot Configuration\" href=\"#copilot-configuration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">I tested GitHub Copilot Chat in VS Code with the Streamable HTTP endpoint, and it successfully called the Jenkins <code>getStatus</code> tool. The Copilot CLI and desktop app have not been tested.</p> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcp&quot;: {\n    &quot;servers&quot;: {\n      &quot;jenkins&quot;: {\n        &quot;type&quot;: &quot;http&quot;,\n        &quot;url&quot;: &quot;https://jenkins-host/mcp-server/mcp&quot;,\n        &quot;headers&quot;: {\n          &quot;Authorization&quot;: &quot;Basic <user:token base64>&quot;\n        }\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"mcp\"</span>: {\n    <span class=\"pl-ent\">\"servers\"</span>: {\n      <span class=\"pl-ent\">\"jenkins\"</span>: {\n        <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http<span class=\"pl-pds\">\"</span></span>,\n        <span class=\"pl-ent\">\"url\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://jenkins-host/mcp-server/mcp<span class=\"pl-pds\">\"</span></span>,\n        <span class=\"pl-ent\">\"headers\"</span>: {\n          <span class=\"pl-ent\">\"Authorization\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n        }\n      }\n    }\n  }\n}</pre>\n  </div> \n  <p dir=\"auto\">Streamable example:</p> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;servers&quot;:{\n    &quot;jenkins&quot;:{\n      &quot;type&quot;:&quot;http&quot;,\n      &quot;url&quot;:&quot;http://jenkins-host/mcp-server/mcp&quot;,\n      &quot;requestInit&quot;:{\n        &quot;headers&quot;:{\n          &quot;Authorization&quot;:&quot;Basic <user:token base64>&quot;\n        }\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"servers\"</span>:{\n    <span class=\"pl-ent\">\"jenkins\"</span>:{\n      <span class=\"pl-ent\">\"type\"</span>:<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"url\"</span>:<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http://jenkins-host/mcp-server/mcp<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"requestInit\"</span>:{\n        <span class=\"pl-ent\">\"headers\"</span>:{\n          <span class=\"pl-ent\">\"Authorization\"</span>:<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n        }\n      }\n    }\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Windsurf Configuration</h4>\n   <a id=\"user-content-windsurf-configuration\" class=\"anchor\" aria-label=\"Permalink: Windsurf Configuration\" href=\"#windsurf-configuration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;servers&quot;: {\n    &quot;jenkins&quot;: {\n      &quot;command&quot;: &quot;npx&quot;,\n      &quot;args&quot;: [\n        &quot;mcp-remote&quot;,\n        &quot;http://jenkins-host/mcp-server/mcp&quot;,\n        &quot;--header&quot;,\n        &quot;Authorization: Bearer ${AUTH_TOKEN}&quot;\n      ],\n      &quot;env&quot;: {\n        &quot;AUTH_TOKEN&quot;: &quot;Basic <user:token base64>&quot;\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"servers\"</span>: {\n    <span class=\"pl-ent\">\"jenkins\"</span>: {\n      <span class=\"pl-ent\">\"command\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>npx<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"args\"</span>: [\n        <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>mcp-remote<span class=\"pl-pds\">\"</span></span>,\n        <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http://jenkins-host/mcp-server/mcp<span class=\"pl-pds\">\"</span></span>,\n        <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>--header<span class=\"pl-pds\">\"</span></span>,\n        <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Authorization: Bearer ${AUTH_TOKEN}<span class=\"pl-pds\">\"</span></span>\n      ],\n      <span class=\"pl-ent\">\"env\"</span>: {\n        <span class=\"pl-ent\">\"AUTH_TOKEN\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n      }\n    }\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Cursor Configuration</h4>\n   <a id=\"user-content-cursor-configuration\" class=\"anchor\" aria-label=\"Permalink: Cursor Configuration\" href=\"#cursor-configuration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;mcpServers&quot;: {\n    &quot;jenkins&quot;: {\n      &quot;type&quot;: &quot;http&quot;,\n      &quot;url&quot;: &quot;https://jenkins-host/mcp-server/mcp&quot;,\n      &quot;headers&quot;: {\n        &quot;Authorization&quot;: &quot;Basic <user:token base64>&quot;\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"mcpServers\"</span>: {\n    <span class=\"pl-ent\">\"jenkins\"</span>: {\n      <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"url\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>https://jenkins-host/mcp-server/mcp<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"headers\"</span>: {\n        <span class=\"pl-ent\">\"Authorization\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n      }\n    }\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Claude</h4>\n   <a id=\"user-content-claude\" class=\"anchor\" aria-label=\"Permalink: Claude\" href=\"#claude\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"claude mcp add jenkins http://jenkins-host/mcp-server/mcp --transport http --header &quot;Authorization: Basic <user:token base64>&quot;\">\n   <pre>claude mcp add jenkins http://jenkins-host/mcp-server/mcp --transport http --header <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Authorization: Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span></pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Stateless Configuration Example</h4>\n   <a id=\"user-content-stateless-configuration-example\" class=\"anchor\" aria-label=\"Permalink: Stateless Configuration Example\" href=\"#stateless-configuration-example\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">For clients that prefer stateless communication without session management:</p> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;servers&quot;: {\n    &quot;jenkins&quot;: {\n      &quot;type&quot;: &quot;http&quot;,\n      &quot;url&quot;: &quot;http://jenkins-host/mcp-server/stateless&quot;,\n      &quot;requestInit&quot;: {\n        &quot;headers&quot;: {\n          &quot;Authorization&quot;: &quot;Basic <user:token base64>&quot;\n        }\n      }\n    }\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"servers\"</span>: {\n    <span class=\"pl-ent\">\"jenkins\"</span>: {\n      <span class=\"pl-ent\">\"type\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"url\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>http://jenkins-host/mcp-server/stateless<span class=\"pl-pds\">\"</span></span>,\n      <span class=\"pl-ent\">\"requestInit\"</span>: {\n        <span class=\"pl-ent\">\"headers\"</span>: {\n          <span class=\"pl-ent\">\"Authorization\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Basic &lt;user:token base64&gt;<span class=\"pl-pds\">\"</span></span>\n        }\n      }\n    }\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Goose</h4>\n   <a id=\"user-content-goose\" class=\"anchor\" aria-label=\"Permalink: Goose\" href=\"#goose\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li>Click <em>“Add custom extension”</em></li> \n   <li>Give it a meaningful name</li> \n   <li>In the type Dropdown, select <em>“Streamable HTTP”</em></li> \n   <li>Enter the endpoint URL. This should be something like <code>http://jenkins-host/mcp-server/mcp</code></li> \n   <li>Scroll to <em>“Request Headers”</em></li> \n   <li>In the empty field, type <code>Authorization</code> as the name. Then in the Value field, type <code>“Basic &lt;user:token base64&gt;”</code></li> \n   <li>Click <em>\"Add\"</em></li> \n   <li>Click <em>“Add Extension”</em></li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Available Tools</h3>\n   <a id=\"user-content-available-tools\" class=\"anchor\" aria-label=\"Permalink: Available Tools\" href=\"#available-tools\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The plugin provides the following built-in tools for interacting with Jenkins:</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Job Management</h4>\n   <a id=\"user-content-job-management\" class=\"anchor\" aria-label=\"Permalink: Job Management\" href=\"#job-management\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li> <p dir=\"auto\"><code>createPipeline</code>: Create a new sandboxed Jenkins pipeline job (requires the Pipeline: Job and Pipeline: Groovy plugins). Required parameters: <code>jobName</code> (name or full path of the pipeline) and <code>pipelineScript</code> (Jenkins pipeline script). Parent folders must already exist. If a job with the provided name already exists, an error is returned.</p> </li> \n   <li> <p dir=\"auto\"><code>getJob</code>: Get a Jenkins job by its full path.</p> </li> \n   <li> <p dir=\"auto\"><code>getJobs</code>: Get a paginated list of Jenkins jobs, sorted by name.</p> </li> \n   <li> <p dir=\"auto\"><code>triggerBuild</code>: Trigger a build of a job. This tool supports parameterized builds. You can provide parameters as a JSON object where each key is the parameter name. For example:</p> \n    <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;jobFullName&quot;: &quot;my-job&quot;,\n  &quot;parameters&quot;: {\n    &quot;BRANCH&quot;: &quot;main&quot;,\n    &quot;DEBUG_MODE&quot;: &quot;true&quot;\n  }\n}\">\n     <pre>{\n  <span class=\"pl-ent\">\"jobFullName\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>my-job<span class=\"pl-pds\">\"</span></span>,\n  <span class=\"pl-ent\">\"parameters\"</span>: {\n    <span class=\"pl-ent\">\"BRANCH\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>main<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"DEBUG_MODE\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>true<span class=\"pl-pds\">\"</span></span>\n  }\n}</pre>\n    </div> <p dir=\"auto\">Note on Parameters:</p> \n    <ul dir=\"auto\"> \n     <li><strong>Core Jenkins Parameters</strong>: Fully supported (String, Boolean, Choice, Text, Password, Run)</li> \n     <li><strong>Plugin Parameters</strong>: Automatically detected and handled using reflection</li> \n     <li><strong>File Parameters</strong>: Not supported via MCP (require file uploads)</li> \n     <li><strong>Multi-select Parameters</strong>: Supported as arrays or lists</li> \n     <li><strong>Custom Plugin Parameters</strong>: Automatically attempted using reflection-based detection</li> \n     <li><strong>Fallback Behavior</strong>: Unsupported parameters fall back to default values with logging This tool returns a queue item if the job is successfully scheduled. You can use the returned queue item ID with the <code>getQueueItem</code> tool.</li> \n    </ul> </li> \n   <li> <p dir=\"auto\"><code>getQueueItem</code>: Get information about a queued item using its ID.</p> </li> \n   <li> <p dir=\"auto\"><code>cancelBuild</code>: Cancel a running build or an item in the queue.</p> </li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Build Information</h4>\n   <a id=\"user-content-build-information\" class=\"anchor\" aria-label=\"Permalink: Build Information\" href=\"#build-information\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><code>getBuild</code>: Retrieve a specific build or the last build of a Jenkins job.</li> \n   <li><code>updateBuild</code>: Update build display name and/or description.</li> \n   <li><code>getBuildLog</code>: Retrieve log lines with pagination for a specific build or the last build. Supports forward reads, end-relative reads (negative <code>skip</code>/<code>limit</code>), and cursor pagination: every response carries a <code>nextCursor</code> you can pass back as <code>cursor</code> to keep reading without re-scanning from the top. The cursor is tied to the <code>(job, buildNumber)</code> it was issued for and is rejected if used against a different build. <code>totalLines</code> is exact for end-relative reads and <code>-1</code> for forward/cursor reads (which stop as soon as they have enough lines, so the total is never computed). Reads a non-blocking snapshot, so it returns promptly even while a build is still running. If <code>nextCursor</code> is set but <code>hasMoreContent</code> is false, you've read everything written so far and the build is still going; hold onto the cursor and call again later to pick up whatever was appended in between.</li> \n   <li><code>searchBuildLog</code>: Search for log lines matching a pattern (string or regex) in build logs. Reads a non-blocking snapshot (returns promptly for in-progress builds) and stops scanning early once <code>maxMatches</code> is reached.</li> \n   <li><code>rebuildBuild</code>: Re-run a build with the same parameters and the same trigger causes (for example a GitLab or GitHub webhook cause), like the Rebuild button. The new run is credited to the MCP caller, not to the user who started the original. Pipeline jobs run their current script (for a multibranch job, the current head of the branch); to re-run the original script, use <code>getReplayScripts</code> and <code>replayBuild</code>. Optional <code>buildNumber</code>; defaults to the last build. Returns the queue item for the new build.</li> \n   <li><code>getReplayScripts</code>: Return the main script and loaded scripts of a replayable Pipeline build. Use this to inspect or modify script before calling <code>replayBuild</code>. Fails for non-Pipeline jobs. Optional <code>buildNumber</code>; defaults to the last build.</li> \n   <li><code>replayBuild</code>: Run a Pipeline build again with a modified script. Provide <code>mainScript</code> (required) and optionally <code>loadedScripts</code>. Optional <code>buildNumber</code>; defaults to the last build. Fails if the build is not replayable or replay is not allowed (e.g. permissions or sandbox).</li> \n   <li><code>getTestResults</code>: Retrieve test results of a specific build or the last build. Returns a compact summary by default (<code>summary=true</code>): the build number, the total/fail/skip/pass counts, how many tests were flaky, and one entry per failing test with its class name, test name, failure message (cut to 512 characters — the head of the stack trace is used when the test reported no message) and <code>age</code>, the number of consecutive builds it has been failing. Pass <code>summary=false</code> for the full junit records, which include each test's <code>stdout</code>, <code>stderr</code> and error stack trace and can run to several megabytes on a build with many failures. Pass <code>onlyFailingTests=true</code> to get those full records for the failing tests only — omitting <code>summary</code> while passing <code>onlyFailingTests=true</code> resolves <code>summary</code> to <code>false</code>, since asking for the failing tests on their own is taken as asking for their detail.</li> \n   <li><code>getFlakyFailures</code>: Retrieve the flaky failures of a specific build or the last build — tests that failed and then passed on a retry. Also returns a compact summary by default: the build number, how many tests were flaky and how many attempts failed, plus each test's class name, test name and the message and type of every flaky attempt. Pass <code>summary=false</code> for each attempt's stack trace, <code>stdout</code> and <code>stderr</code>.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">SCM Integration</h4>\n   <a id=\"user-content-scm-integration\" class=\"anchor\" aria-label=\"Permalink: SCM Integration\" href=\"#scm-integration\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><code>getJobScm</code>: Retrieve SCM configurations of a Jenkins job.</li> \n   <li><code>getBuildScm</code>: Retrieve SCM configurations of a specific build.</li> \n   <li><code>getBuildChangeSets</code>: Retrieve change log sets of a specific build.</li> \n   <li><code>findJobsWithScmUrl</code>: Find jobs using a specific SCM (git) repository URL</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Management Information</h4>\n   <a id=\"user-content-management-information\" class=\"anchor\" aria-label=\"Permalink: Management Information\" href=\"#management-information\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><code>whoAmI</code>: Get information about the current user.</li> \n   <li><code>getStatus</code>: Checks the health and readiness status of a Jenkins instance. Use this tool to assess Jenkins instance health rather than simple up/down status.</li> \n   <li><code>getSystemLog</code>: Read recent entries from the Jenkins system log (newest first), optionally from a named Log Recorder or filtered by a minimum level. Requires the Overall/SystemRead permission.</li> \n   <li><code>getLogRecorders</code>: List the names of configured Jenkins Log Recorders, for use with <code>getSystemLog</code>. Requires the Overall/SystemRead permission.</li> \n  </ul> \n  <p dir=\"auto\">Each tool accepts specific parameters to customize its behavior. For detailed usage instructions and parameter descriptions, refer to the API documentation or use the MCP introspection capabilities.</p> \n  <p dir=\"auto\">To use these tools, connect to the MCP server endpoint and make tool calls using your MCP client implementation.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Enhanced Parameter Support</h3>\n   <a id=\"user-content-enhanced-parameter-support\" class=\"anchor\" aria-label=\"Permalink: Enhanced Parameter Support\" href=\"#enhanced-parameter-support\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server Plugin now provides comprehensive support for Jenkins parameters:</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Supported Parameter Types</h4>\n   <a id=\"user-content-supported-parameter-types\" class=\"anchor\" aria-label=\"Permalink: Supported Parameter Types\" href=\"#supported-parameter-types\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><strong>String Parameters</strong>: Text input with default values</li> \n   <li><strong>Boolean Parameters</strong>: True/false values with automatic type conversion</li> \n   <li><strong>Choice Parameters</strong>: Dropdown selections with validation</li> \n   <li><strong>Text Parameters</strong>: Multi-line text input</li> \n   <li><strong>Password Parameters</strong>: Secure input with Secret handling</li> \n   <li><strong>Run Parameters</strong>: Build number references</li> \n   <li><strong>Plugin Parameters</strong>: Automatically detected and handled</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Parameter Handling Features</h4>\n   <a id=\"user-content-parameter-handling-features\" class=\"anchor\" aria-label=\"Permalink: Parameter Handling Features\" href=\"#parameter-handling-features\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <ul dir=\"auto\"> \n   <li><strong>Type Conversion</strong>: Automatic conversion between JSON types and Jenkins parameter types</li> \n   <li><strong>Validation</strong>: Choice parameters validate input against available options</li> \n   <li><strong>Fallback</strong>: Unsupported parameters gracefully fall back to defaults</li> \n   <li><strong>Reflection</strong>: Plugin parameter types automatically detected and handled</li> \n   <li><strong>Logging</strong>: Comprehensive logging for debugging parameter issues</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Example Usage</h4>\n   <a id=\"user-content-example-usage\" class=\"anchor\" aria-label=\"Permalink: Example Usage\" href=\"#example-usage\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <div class=\"highlight highlight-source-json notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"{\n  &quot;jobFullName&quot;: &quot;my-parameterized-job&quot;,\n  &quot;parameters&quot;: {\n    &quot;BRANCH&quot;: &quot;main&quot;,\n    &quot;DEBUG_MODE&quot;: true,\n    &quot;ENVIRONMENT&quot;: &quot;production&quot;,\n    &quot;FEATURES&quot;: [&quot;feature1&quot;, &quot;feature2&quot;],\n    &quot;NOTES&quot;: &quot;Build triggered via MCP&quot;\n  }\n}\">\n   <pre>{\n  <span class=\"pl-ent\">\"jobFullName\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>my-parameterized-job<span class=\"pl-pds\">\"</span></span>,\n  <span class=\"pl-ent\">\"parameters\"</span>: {\n    <span class=\"pl-ent\">\"BRANCH\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>main<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"DEBUG_MODE\"</span>: <span class=\"pl-c1\">true</span>,\n    <span class=\"pl-ent\">\"ENVIRONMENT\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>production<span class=\"pl-pds\">\"</span></span>,\n    <span class=\"pl-ent\">\"FEATURES\"</span>: [<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>feature1<span class=\"pl-pds\">\"</span></span>, <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>feature2<span class=\"pl-pds\">\"</span></span>],\n    <span class=\"pl-ent\">\"NOTES\"</span>: <span class=\"pl-s\"><span class=\"pl-pds\">\"</span>Build triggered via MCP<span class=\"pl-pds\">\"</span></span>\n  }\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Extending MCP Capabilities</h3>\n   <a id=\"user-content-extending-mcp-capabilities\" class=\"anchor\" aria-label=\"Permalink: Extending MCP Capabilities\" href=\"#extending-mcp-capabilities\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">To add new MCP tools or functionalities:</p> \n  <ol dir=\"auto\"> \n   <li>Create a class implementing <code>McpServerExtension</code>.</li> \n   <li>Use <code>@Tool</code> to expose methods as MCP tools.</li> \n   <li>Use <code>@ToolParam</code> to define and describe tool parameters.</li> \n  </ol> \n  <p dir=\"auto\">Example:</p> \n  <div class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@Extension\npublic class MyCustomMcpExtension implements McpServerExtension {\n\t@Tool(description = &quot;My custom tool&quot;)\n\tpublic String myCustomTool(@ToolParam(description = &quot;Input parameter&quot;) String input) {\n\t\t// Tool implementation\n\t}\n}\">\n   <pre><span class=\"pl-c1\">@</span><span class=\"pl-c1\">Extension</span>\n<span class=\"pl-k\">public</span> <span class=\"pl-k\">class</span> <span class=\"pl-smi\">MyCustomMcpExtension</span> <span class=\"pl-k\">implements</span> <span class=\"pl-smi\">McpServerExtension</span> {\n\t<span class=\"pl-c1\">@</span><span class=\"pl-c1\">Tool</span>(<span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"My custom tool\"</span>)\n\t<span class=\"pl-k\">public</span> <span class=\"pl-smi\">String</span> <span class=\"pl-en\">myCustomTool</span>(<span class=\"pl-c1\">@</span><span class=\"pl-c1\">ToolParam</span>(<span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"Input parameter\"</span>) <span class=\"pl-smi\">String</span> <span class=\"pl-s1\">input</span>) {\n\t\t<span class=\"pl-c\">// Tool implementation</span>\n\t}\n}</pre>\n  </div> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Constraining parameter values</h4>\n   <a id=\"user-content-constraining-parameter-values\" class=\"anchor\" aria-label=\"Permalink: Constraining parameter values\" href=\"#constraining-parameter-values\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">For an object-shaped parameter (typically a <code>Map</code>), you can advertise a JSON Schema constraint on the <em>values</em> while keeping the keys open, using <code>@ToolParam(additionalProperties = \"&lt;json&gt;\")</code>. The value is a raw JSON sub-schema — a JSON object or a boolean — emitted verbatim as the parameter's <code>additionalProperties</code>:</p> \n  <div class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@Tool(description = &quot;My custom tool&quot;)\npublic String myCustomTool(\n        @ToolParam(\n                description = &quot;Extra options&quot;,\n                required = false,\n                additionalProperties = &quot;{\\&quot;type\\&quot;:[\\&quot;string\\&quot;,\\&quot;boolean\\&quot;,\\&quot;integer\\&quot;,\\&quot;number\\&quot;,\\&quot;array\\&quot;]}&quot;)\n        Map<String, Object> options) {\n    // Tool implementation\n}\">\n   <pre><span class=\"pl-c1\">@</span><span class=\"pl-c1\">Tool</span>(<span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"My custom tool\"</span>)\n<span class=\"pl-k\">public</span> <span class=\"pl-smi\">String</span> <span class=\"pl-en\">myCustomTool</span>(\n        <span class=\"pl-c1\">@</span><span class=\"pl-c1\">ToolParam</span>(\n                <span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"Extra options\"</span>,\n                <span class=\"pl-s1\">required</span> = <span class=\"pl-c1\">false</span>,\n                <span class=\"pl-s1\">additionalProperties</span> = <span class=\"pl-s\">\"{<span class=\"pl-cce\">\\\"</span>type<span class=\"pl-cce\">\\\"</span>:[<span class=\"pl-cce\">\\\"</span>string<span class=\"pl-cce\">\\\"</span>,<span class=\"pl-cce\">\\\"</span>boolean<span class=\"pl-cce\">\\\"</span>,<span class=\"pl-cce\">\\\"</span>integer<span class=\"pl-cce\">\\\"</span>,<span class=\"pl-cce\">\\\"</span>number<span class=\"pl-cce\">\\\"</span>,<span class=\"pl-cce\">\\\"</span>array<span class=\"pl-cce\">\\\"</span>]}\"</span>)\n        <span class=\"pl-smi\">Map</span>&lt;<span class=\"pl-smi\">String</span>, <span class=\"pl-smi\">Object</span>&gt; <span class=\"pl-s1\">options</span>) {\n    <span class=\"pl-c\">// Tool implementation</span>\n}</pre>\n  </div> \n  <p dir=\"auto\">Invalid JSON, or a value that isn't a JSON object or boolean, fails fast when the tool is registered.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Restricting a tool by permission</h4>\n   <a id=\"user-content-restricting-a-tool-by-permission\" class=\"anchor\" aria-label=\"Permalink: Restricting a tool by permission\" href=\"#restricting-a-tool-by-permission\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">Add <code>permissions</code> to <code>@Tool</code> to require the caller to hold a Jenkins permission. List one or more permission ids (as returned by <code>Permission.getId()</code>, for example <code>hudson.model.Hudson.SystemRead</code>):</p> \n  <div class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@Tool(\n        description = &quot;Read the Jenkins system log&quot;,\n        permissions = {&quot;hudson.model.Hudson.SystemRead&quot;})\npublic SystemLog readSystemLog() {\n    // ...\n}\">\n   <pre><span class=\"pl-c1\">@</span><span class=\"pl-c1\">Tool</span>(\n        <span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"Read the Jenkins system log\"</span>,\n        <span class=\"pl-s1\">permissions</span> = {<span class=\"pl-s\">\"hudson.model.Hudson.SystemRead\"</span>})\n<span class=\"pl-k\">public</span> <span class=\"pl-smi\">SystemLog</span> <span class=\"pl-en\">readSystemLog</span>() {\n    <span class=\"pl-c\">// ...</span>\n}</pre>\n  </div> \n  <p dir=\"auto\">The caller must hold <strong>at least one</strong> of the listed permissions. A tool that fails the check is hidden from <code>tools/list</code> and rejected on <code>tools/call</code>. When Jenkins security is disabled, every tool is available. Permission ids are resolved when the server starts, so a typo fails fast. For a sensitive operation, still call <code>Jenkins.get().checkPermission(...)</code> inside the method as defence in depth.</p> \n  <p dir=\"auto\"><strong>Overall permissions only.</strong> The check runs against the Jenkins root, so <code>permissions</code> is for global permissions such as <code>Overall/SystemRead</code> or <code>Overall/Administer</code>. It cannot express item-scoped permissions like <code>Item.READ</code> on a particular folder or job — a tool has no item context. Enforce those inside the method against the specific item (for example <code>job.checkPermission(Item.READ)</code>).</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Overriding a Built-in Tool</h3>\n   <a id=\"user-content-overriding-a-built-in-tool\" class=\"anchor\" aria-label=\"Permalink: Overriding a Built-in Tool\" href=\"#overriding-a-built-in-tool\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">You can replace a built-in tool (or any tool contributed by another plugin) with your own implementation from a separate plugin. Declare a <code>@Tool</code> with the <strong>same name</strong> and set <code>override = true</code>:</p> \n  <div class=\"highlight highlight-source-java notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"@Extension\npublic class MyBuildLogExtension implements McpServerExtension {\n\t@Tool(name = &quot;getBuildLog&quot;, description = &quot;My own getBuildLog&quot;, override = true)\n\tpublic MyResponse getBuildLog(@ToolParam(description = &quot;Job full name&quot;) String jobFullName) {\n\t\t// Your implementation replaces the built-in getBuildLog\n\t}\n}\">\n   <pre><span class=\"pl-c1\">@</span><span class=\"pl-c1\">Extension</span>\n<span class=\"pl-k\">public</span> <span class=\"pl-k\">class</span> <span class=\"pl-smi\">MyBuildLogExtension</span> <span class=\"pl-k\">implements</span> <span class=\"pl-smi\">McpServerExtension</span> {\n\t<span class=\"pl-c1\">@</span><span class=\"pl-c1\">Tool</span>(<span class=\"pl-s1\">name</span> = <span class=\"pl-s\">\"getBuildLog\"</span>, <span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"My own getBuildLog\"</span>, <span class=\"pl-s1\">override</span> = <span class=\"pl-c1\">true</span>)\n\t<span class=\"pl-k\">public</span> <span class=\"pl-smi\">MyResponse</span> <span class=\"pl-en\">getBuildLog</span>(<span class=\"pl-c1\">@</span><span class=\"pl-c1\">ToolParam</span>(<span class=\"pl-s1\">description</span> = <span class=\"pl-s\">\"Job full name\"</span>) <span class=\"pl-smi\">String</span> <span class=\"pl-s1\">jobFullName</span>) {\n\t\t<span class=\"pl-c\">// Your implementation replaces the built-in getBuildLog</span>\n\t}\n}</pre>\n  </div> \n  <p dir=\"auto\">Rules:</p> \n  <ul dir=\"auto\"> \n   <li>Overriding is an explicit opt-in. A tool only replaces another tool of the same name when it sets <code>override = true</code>. This guarantees a built-in tool is never silently shadowed by an accidental name clash.</li> \n   <li>If two tools share a name and <strong>none</strong> of them sets <code>override = true</code>, the existing (built-in) tool is kept and the duplicate is skipped with a warning in the logs.</li> \n   <li>The <code>@Extension(ordinal = ...)</code> value is only used to break ties when <strong>several</strong> tools declare <code>override = true</code> for the same name: the one provided by the extension with the highest ordinal wins.</li> \n   <li>Each tool name is exposed exactly once, so MCP clients always see a single <code>getBuildLog</code>.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Result Handling</h3>\n   <a id=\"user-content-result-handling\" class=\"anchor\" aria-label=\"Permalink: Result Handling\" href=\"#result-handling\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server Plugin handles various result types with the following approach:</p> \n  <ul dir=\"auto\"> \n   <li><strong>List Results</strong>: Each element in the list is converted to a separate text content item in the response.</li> \n   <li><strong>Single Objects</strong>: The entire object is converted into a single text content item.</li> \n  </ul> \n  <p dir=\"auto\">For serialization to text content:</p> \n  <ul dir=\"auto\"> \n   <li><strong>@ExportedBean Annotation</strong>: If the result object is annotated with <code>@ExportedBean</code> (from <code>org.kohsuke.stapler.export</code>), Jenkins' <code>org.kohsuke.stapler.export.Flavor.JSON</code> exporting mechanism is used.</li> \n   <li><strong>Other Objects</strong>: For objects without the <code>@ExportedBean</code> annotation, Jackson is used for JSON serialization.</li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h4 class=\"heading-element\" dir=\"auto\">Field selection with <code>tree</code> and per-tool defaults</h4>\n   <a id=\"user-content-field-selection-with-tree-and-per-tool-defaults\" class=\"anchor\" aria-label=\"Permalink: Field selection with tree and per-tool defaults\" href=\"#field-selection-with-tree-and-per-tool-defaults\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">Tools returning <code>@ExportedBean</code> objects accept an optional <code>tree</code> parameter using the <a href=\"https://www.jenkins.io/doc/book/using/remote-access-api/#RemoteaccessAPI-Depthcontrol\" rel=\"nofollow\">Jenkins Remote REST API tree syntax</a> (for example <code>tree=name,url,lastBuild[number,result]</code>) to limit which fields are returned.</p> \n  <p dir=\"auto\">A tool may also declare a <strong>default tree</strong> (<code>@Tool(defaultTree = \"...\")</code>), applied only when the caller does not pass <code>tree</code>. The built-in <code>getBuild</code>, <code>getJob</code> and <code>getJobs</code> tools use such compact defaults: without an explicit <code>tree</code> they return the identity/status essentials rather than the full exported model, which keeps responses small for LLM context windows. Pass your own <code>tree</code> expression to request any other fields — an explicit <code>tree</code> always takes precedence over the default, and passing <code>tree=\"*\"</code> returns the full exported object (pruning disabled), bypassing the default entirely. Tools without a declared default keep returning the full exported object.</p> \n  <p dir=\"auto\">This approach ensures flexible and efficient handling of different result types, accommodating both Jenkins-specific exported objects and standard Java objects. This flexible approach ensures that tool results are consistently and accurately represented in the MCP response, regardless of their complexity.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Integration with GitHub Copilot</h3>\n   <a id=\"user-content-integration-with-github-copilot\" class=\"anchor\" aria-label=\"Permalink: Integration with GitHub Copilot\" href=\"#integration-with-github-copilot\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">The MCP Server Plugin seamlessly integrates with GitHub Copilot, enhancing your development experience by providing direct access to Jenkins information within your IDE. This integration allows you to interact with Jenkins jobs and builds using natural language queries. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/jenkinsci/mcp-server-plugin/blob/main/doc/copilot.png\"><img src=\"https://cdn.jsdelivr.net/gh/jenkinsci/mcp-server-plugin@main/doc/copilot.png\" alt=\"GitHub Copilot Integration\" style=\"max-width: 100%;\"></a></p> \n  <p dir=\"auto\">As shown in the screenshot:</p> \n  <ol dir=\"auto\"> \n   <li>You can ask Copilot about Jenkins jobs using natural language, e.g., \"list jenkins job under root\".</li> \n   <li>Copilot uses the MCP Server to fetch and display information about Jenkins jobs, listing the jobs under the root directory.</li> \n   <li>You can also request specific information, such as \"get the last build status of job a\", and Copilot will provide the relevant details including build number, status, and URL.</li> \n  </ol> \n  <p dir=\"auto\">This integration streamlines your workflow by allowing you to access Jenkins information without leaving your development environment.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Further Information</h3>\n   <a id=\"user-content-further-information\" class=\"anchor\" aria-label=\"Permalink: Further Information\" href=\"#further-information\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">For more details on the Model Context Protocol and its Java SDK:</p> \n  <ul dir=\"auto\"> \n   <li><a href=\"https://modelcontextprotocol.io/introduction\" rel=\"nofollow\">MCP Introduction</a></li> \n   <li><a href=\"https://modelcontextprotocol.io/sdk/java/mcp-server\" rel=\"nofollow\">MCP Java SDK Server Component</a></li> \n  </ul> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">Contributing</h3>\n   <a id=\"user-content-contributing\" class=\"anchor\" aria-label=\"Permalink: Contributing\" href=\"#contributing\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">Contributions to the MCP Server plugin are welcome. Please refer to the <a href=\"https://github.com/jenkinsci/.github/blob/master/CONTRIBUTING.md\">Jenkins contribution guidelines</a> for more information.</p> \n  <div class=\"markdown-heading\" dir=\"auto\">\n   <h3 class=\"heading-element\" dir=\"auto\">License</h3>\n   <a id=\"user-content-license\" class=\"anchor\" aria-label=\"Permalink: License\" href=\"#license\">\n    <svg data-component=\"Octicon\" class=\"octicon octicon-link\" viewbox=\"0 0 16 16\" version=\"1.1\" width=\"16\" height=\"16\" aria-hidden=\"true\">\n     <path d=\"m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z\"></path>\n    </svg></a>\n  </div> \n  <p dir=\"auto\">This project is licensed under the MIT License - see the <a href=\"https://github.com/jenkinsci/mcp-server-plugin/blob/main/LICENSE.md\">LICENSE</a> file for details.</p> \n </article>\n</div>","url":"https://github.com/jenkinsci/mcp-server-plugin"},"defaultBranch":"main"}