From a3a36515aecc8363afe43873b3b7a755e279aed9 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Thu, 13 Aug 2026 15:58:02 +1000 Subject: [PATCH] Reduce tools number Signed-off-by: Olivier Lamy --- README.md | 1 - .../server/extensions/DefaultMcpServer.java | 43 ++++++++++++++----- .../server/extensions/JobScmExtension.java | 24 ----------- .../plugins/mcp/server/EndPointTest.java | 2 - .../extensions/JobScmExtensionTest.java | 7 +-- 5 files changed, 37 insertions(+), 40 deletions(-) diff --git a/README.md b/README.md index 0812466d..29dd284c 100644 --- a/README.md +++ b/README.md @@ -402,7 +402,6 @@ The plugin provides the following built-in tools for interacting with Jenkins: - `getTestResults`: Retrieve test results of a specific build or the last build. #### SCM Integration -- `getJobScm`: Retrieve SCM configurations of a Jenkins job. - `getBuildScm`: Retrieve SCM configurations of a specific build. - `getBuildChangeSets`: Retrieve change log sets of a specific build. - `findJobsWithScmUrl`: Find jobs using a specific SCM (git) repository URL diff --git a/src/main/java/io/jenkins/plugins/mcp/server/extensions/DefaultMcpServer.java b/src/main/java/io/jenkins/plugins/mcp/server/extensions/DefaultMcpServer.java index 0ffbbc32..26c704c4 100644 --- a/src/main/java/io/jenkins/plugins/mcp/server/extensions/DefaultMcpServer.java +++ b/src/main/java/io/jenkins/plugins/mcp/server/extensions/DefaultMcpServer.java @@ -48,18 +48,15 @@ import io.jenkins.plugins.mcp.server.McpServerExtension; import io.jenkins.plugins.mcp.server.annotation.Tool; import io.jenkins.plugins.mcp.server.annotation.ToolParam; +import io.jenkins.plugins.mcp.server.extensions.scm.GitScmConfig; +import io.jenkins.plugins.mcp.server.extensions.scm.GitScmUtil; import io.jenkins.plugins.mcp.server.tool.JenkinsMcpContext; import jakarta.annotation.Nullable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import jenkins.model.Jenkins; import jenkins.model.ParameterizedJobMixIn; import jenkins.model.queue.QueueItem; +import jenkins.triggers.SCMTriggerItem; import lombok.AllArgsConstructor; import lombok.Data; import lombok.SneakyThrows; @@ -89,9 +86,35 @@ public Run getBuild( @Tool( description = "Get a Jenkins job by its full path", annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint = false)) - public Job getJob( - @ToolParam(description = "Job full name of the Jenkins job (e.g., 'folder/job-name')") String jobFullName) { - return Jenkins.get().getItemByFullName(jobFullName, Job.class); + public JobWithScmConfigs getJob( + @ToolParam(description = "Job full name of the Jenkins job (e.g., 'folder/job-name')") String jobFullName, + @ToolParam( + description = + "To retrieves scm configurations of a Jenkins job (only for type SCMTriggerItem", + required = false) + boolean includeScmConfigurations) { + Job job = Jenkins.get().getItemByFullName(jobFullName, Job.class); + if (job == null) { + return null; + } + if (includeScmConfigurations && job instanceof SCMTriggerItem scmItem) { + if (job.hasPermission(Item.EXTENDED_READ)) { + List gitScmConfigs = scmItem.getSCMs().stream() + .filter(scm -> scm.getType().equals("hudson.plugins.git.GitSCM")) + .map(GitScmUtil::extractGitScmInfo) + .filter(Objects::nonNull) + .toList(); + return new JobWithScmConfigs(job, gitScmConfigs); + } + } + return new JobWithScmConfigs(job, Collections.emptyList()); + } + + @Data + @AllArgsConstructor + public static class JobWithScmConfigs { + private Job job; + private List gitScmConfigs; } /** diff --git a/src/main/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtension.java b/src/main/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtension.java index 237b19b8..e7d3c229 100644 --- a/src/main/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtension.java +++ b/src/main/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtension.java @@ -43,7 +43,6 @@ import jakarta.annotation.Nullable; import java.net.URISyntaxException; import java.util.List; -import java.util.Objects; import java.util.Optional; import java.util.logging.Level; import java.util.logging.Logger; @@ -62,29 +61,6 @@ public static boolean isGitPluginInstalled() { return gitPlugin != null && gitPlugin.isActive(); } - @Tool( - description = "Retrieves scm configurations of a Jenkins job", - annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint = false)) - public List getJobScm( - @ToolParam(description = "Full path of the Jenkins job (e.g., 'folder/job-name')") String jobFullName) { - var job = Jenkins.get().getItemByFullName(jobFullName, Job.class); - if (job instanceof SCMTriggerItem scmItem) { - if (job.hasPermission(Item.EXTENDED_READ)) { - return scmItem.getSCMs().stream() - .map(scm -> { - Object result = null; - if (scm.getType().equals("hudson.plugins.git.GitSCM")) { - result = GitScmUtil.extractGitScmInfo(scm); - } - return result; - }) - .filter(Objects::nonNull) - .toList(); - } - } - return List.of(); - } - @Tool( description = "Retrieves scm configurations of a Jenkins build", annotations = @Tool.Annotations(readOnlyHint = true, destructiveHint = false)) diff --git a/src/test/java/io/jenkins/plugins/mcp/server/EndPointTest.java b/src/test/java/io/jenkins/plugins/mcp/server/EndPointTest.java index d49c2c28..2e6a9813 100644 --- a/src/test/java/io/jenkins/plugins/mcp/server/EndPointTest.java +++ b/src/test/java/io/jenkins/plugins/mcp/server/EndPointTest.java @@ -62,7 +62,6 @@ void testListTools(JenkinsRule jenkins, JenkinsMcpClientBuilder jenkinsMcpClient "getJobs", "getBuild", "getJob", - "getJobScm", "getBuildScm", "findJobsWithScmUrl", "getBuildChangeSets", @@ -106,7 +105,6 @@ void testBuiltinToolHints(JenkinsRule jenkins, JenkinsMcpClientBuilder jenkinsMc "searchBuildLog", "getTestResults", "getFlakyFailures", - "getJobScm", "getBuildScm", "getBuildChangeSets", "findJobsWithScmUrl" diff --git a/src/test/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtensionTest.java b/src/test/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtensionTest.java index db234e00..6c0f8809 100644 --- a/src/test/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtensionTest.java +++ b/src/test/java/io/jenkins/plugins/mcp/server/extensions/JobScmExtensionTest.java @@ -48,7 +48,8 @@ public class JobScmExtensionTest { @McpClientTest - void testGetJobScm(JenkinsRule jenkins, GitSampleRepoRule gitRepo, JenkinsMcpClientBuilder jenkinsMcpClientBuilder) + void testGetJobWithScm( + JenkinsRule jenkins, GitSampleRepoRule gitRepo, JenkinsMcpClientBuilder jenkinsMcpClientBuilder) throws Exception { // Setup Git repository gitRepo.init(); @@ -64,8 +65,8 @@ void testGetJobScm(JenkinsRule jenkins, GitSampleRepoRule gitRepo, JenkinsMcpCli try (var client = jenkinsMcpClientBuilder.jenkins(jenkins).build()) { // Call getJobScm tool - McpSchema.CallToolRequest request = - new McpSchema.CallToolRequest("getJobScm", Map.of("jobFullName", project.getFullName())); + McpSchema.CallToolRequest request = new McpSchema.CallToolRequest( + "getJob", Map.of("jobFullName", project.getFullName(), "includeScmConfigurations", Boolean.TRUE)); var response = client.callTool(request);