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 6af0a89..d2ef6cc 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 @@ -84,6 +84,33 @@ public Job getJob( return Jenkins.get().getItemByFullName(jobFullName, Job.class); } + /** + * A {@link Cause} that indicates a Jenkins build was triggered via MCP call. + *
+ * This is useful for the end user to understand that the call was trigger through this plugin's code + * and not some manual user intervention.
+ *And among others, it allows plugins like + * ... to offer custom badges
+ * + * @see #triggerBuild(String, Map) + */ + public static class MCPCause extends Cause { + private final String userId; + + public MCPCause() { + User currentUser = User.current(); + this.userId = currentUser != null ? currentUser.getId() : null; + } + + @Override + public String getShortDescription() { + if (userId != null) { + return "Triggered via MCP Server by " + userId; + } + return "Triggered via MCP Server"; + } + } + @Tool(description = "Trigger a build for a Jenkins job") // keep the default value for destructive (true) public boolean triggerBuild( @ToolParam(description = "Full path of the Jenkins job (e.g., 'folder/job-name')") String jobFullName, @@ -93,8 +120,7 @@ public boolean triggerBuild( if (job != null) { job.checkPermission(Item.BUILD); - Cause.UserIdCause userIdCause = new Cause.UserIdCause(); - CauseAction action = new CauseAction(userIdCause); + CauseAction action = new CauseAction(new MCPCause()); if (job.isParameterized() && job instanceof Job j) { ParametersDefinitionProperty parametersDefinition = (ParametersDefinitionProperty) j.getProperty(ParametersDefinitionProperty.class);