Skip to content

Commit f285e56

Browse files
sahilhindwani-harnessHarness
authored andcommitted
feat: [RM-320]: Add a new tool call for release management in cd and prompt for the same. (#112)
1 parent 952caf9 commit f285e56

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

pkg/harness/prompts/prompts.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,12 @@ func RegisterPrompts(mcpServer *server.MCPServer) {
3434
}`).
3535
Build())
3636

37+
prompts.Append(
38+
p.NewPrompt().SetName("ask_release_agent_prompt").
39+
SetDescription("Prompt for the Ask Release Agent tool").
40+
SetResultDescription("Ask Release Agent prompt").
41+
SetText(`{"standard": "When calling ask_release_agent, ensure you have the required parameters for release process operations:\n- First, clarify the user's release requirements; echo back your understanding before calling the tool.\n- Include relevant context for release processes, such as:\n - Release process requirements\n- The RMG AI DevOps Agent specializes in creating release processes and will automatically use the CREATE_PROCESS action.\n- Provide detailed requirements to get the most accurate release process configuration.\n- Do not use the words \"pipeline\" or \"stages\" in your response."}`).
42+
Build())
43+
3744
p.AddPrompts(prompts, mcpServer)
3845
}

pkg/harness/tools.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,9 @@ func initLegacyToolsets(config *config.Config, tsg *toolsets.ToolsetGroup) error
271271
if err := modules.RegisterInfrastructure(config, tsg); err != nil {
272272
return err
273273
}
274+
if err := modules.RegisterReleaseManagementTools(config, tsg); err != nil {
275+
return err
276+
}
274277
if err := modules.RegisterACM(config, tsg); err != nil {
275278
return err
276279
}
@@ -382,6 +385,10 @@ func initLegacyToolsets(config *config.Config, tsg *toolsets.ToolsetGroup) error
382385
if err := modules.RegisterInfrastructure(config, tsg); err != nil {
383386
return err
384387
}
388+
case "release_management":
389+
if err := modules.RegisterReleaseManagementTools(config, tsg); err != nil {
390+
return err
391+
}
385392
case "acm":
386393
if err := modules.RegisterACM(config, tsg); err != nil {
387394
return err

pkg/harness/tools/rmg.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package tools
2+
3+
import (
4+
"github.com/harness/harness-mcp/client"
5+
"github.com/harness/harness-mcp/client/dto"
6+
"github.com/harness/harness-mcp/cmd/harness-mcp-server/config"
7+
"github.com/harness/harness-mcp/pkg/harness/common"
8+
"github.com/mark3labs/mcp-go/mcp"
9+
"github.com/mark3labs/mcp-go/server"
10+
)
11+
12+
// AskReleaseAgentTool creates a tool for Ask Release Agent with CREATE_PROCESS action
13+
func AskReleaseAgentTool(config *config.Config, client *client.GenaiService) (tool mcp.Tool, handler server.ToolHandlerFunc) {
14+
// Get common parameters
15+
commonParams := getCommonGenAIParameters()
16+
17+
// Add tool-specific parameters (removing action since it's hardcoded)
18+
toolParams := append(commonParams,
19+
common.WithScope(config, false),
20+
)
21+
22+
tool = mcp.NewTool("ask_release_agent",
23+
append([]mcp.ToolOption{mcp.WithDescription("The Ask Release Agent is an expert in planning and executing requests related to generation/updation of Harness release processes. ALWAYS PASS ORIGINAL PROMPT FROM USER TO THIS.")},
24+
toolParams...)...,
25+
)
26+
27+
handler = createGenAIToolHandler(config, client, func(baseParams *dto.BaseRequestParameters, request mcp.CallToolRequest) (interface{}, error) {
28+
// Create the service chat parameters
29+
return &dto.ServiceChatParameters{
30+
BaseRequestParameters: *baseParams,
31+
Action: dto.RequestAction("CREATE_PROCESS"),
32+
}, nil
33+
})
34+
35+
return tool, handler
36+
}

pkg/modules/cd.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func (m *CDModule) Toolsets() []string {
3838
"services",
3939
"environments",
4040
"infrastructure",
41+
"release_management",
4142
}
4243
}
4344

@@ -57,6 +58,10 @@ func (m *CDModule) RegisterToolsets() error {
5758
if err := RegisterInfrastructure(m.config, m.tsg); err != nil {
5859
return err
5960
}
61+
case "release_management":
62+
if err := RegisterReleaseManagementTools(m.config, m.tsg); err != nil {
63+
return err
64+
}
6065
}
6166
}
6267
return nil
@@ -154,3 +159,27 @@ func RegisterEnvironments(config *config.Config, tsg *toolsets.ToolsetGroup) err
154159
tsg.AddToolset(environments)
155160
return nil
156161
}
162+
163+
// RegisterReleaseManagementTools registers the Release Management tools
164+
func RegisterReleaseManagementTools(config *config.Config, tsg *toolsets.ToolsetGroup) error {
165+
// Skip registration for external mode for now
166+
if !config.Internal {
167+
return nil
168+
}
169+
170+
// Get the GenAI client
171+
genaiClient, err := GetGenAIClient(config)
172+
if err != nil {
173+
return err
174+
}
175+
176+
// Create the Ask Release Agent toolset
177+
askReleaseAgent := toolsets.NewToolset("release_management", "Release Management tools").
178+
AddReadTools(
179+
toolsets.NewServerTool(tools.AskReleaseAgentTool(config, genaiClient)),
180+
)
181+
182+
// Add toolset to the group
183+
tsg.AddToolset(askReleaseAgent)
184+
return nil
185+
}

0 commit comments

Comments
 (0)