@@ -56,11 +56,10 @@ func GetCcmOverviewTool(config *config.Config, client *client.CloudCostManagemen
56
56
if err != nil {
57
57
return mcp .NewToolResultError (err .Error ()), nil
58
58
}
59
-
60
59
startTime , err := utils .FormatMMDDYYYYToUnixMillis (startTimeStr )
61
60
endTime , err := utils .FormatMMDDYYYYToUnixMillis (endTimeStr )
62
-
63
61
groupBy , err := requiredParam [string ](request , "groupBy" )
62
+
64
63
if err != nil {
65
64
return mcp .NewToolResultError (err .Error ()), nil
66
65
}
@@ -79,6 +78,70 @@ func GetCcmOverviewTool(config *config.Config, client *client.CloudCostManagemen
79
78
}
80
79
}
81
80
81
+
82
+ func ListCcmCostCategoriesTool (config * config.Config , client * client.CloudCostManagementService ) (tool mcp.Tool , handler server.ToolHandlerFunc ) {
83
+ return mcp .NewTool ("list_ccm_cost_categories" ,
84
+ mcp .WithDescription ("List the cost categories from an account in Harness Cloud Cost Management" ),
85
+ mcp .WithString ("account_id" ,
86
+ mcp .Description ("The account identifier" ),
87
+ ),
88
+ mcp .WithString ("cost_category" ,
89
+ mcp .Description ("Optional to search for specific category" ),
90
+ ),
91
+ mcp .WithString ("search_term" ,
92
+ mcp .Description ("Optional search term to filter cost categories" ),
93
+ ),
94
+ WithScope (config , false ),
95
+ ),
96
+ func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
97
+ accountId , err := OptionalParam [string ](request , "account_id" )
98
+ if accountId == "" {
99
+ accountId , err = getAccountID (config , request )
100
+ }
101
+ if err != nil {
102
+ return mcp .NewToolResultError (err .Error ()), nil
103
+ }
104
+
105
+ params := & dto.CcmListCostCategoriesOptions {}
106
+ params .AccountIdentifier = accountId
107
+
108
+ // Handle cost category parameter
109
+ costCategory , ok , err := OptionalParamOK [string ](request , "cost_category" )
110
+ if err != nil {
111
+ return mcp .NewToolResultError (err .Error ()), nil
112
+ }
113
+ if ok && costCategory != "" {
114
+ params .CostCategory = costCategory
115
+ }
116
+
117
+ // Handle search parameter
118
+ searchTerm , ok , err := OptionalParamOK [string ](request , "search_term" )
119
+ if err != nil {
120
+ return mcp .NewToolResultError (err .Error ()), nil
121
+ }
122
+ if ok && searchTerm != "" {
123
+ params .SearchTerm = searchTerm
124
+ }
125
+
126
+ scope , err := fetchScope (config , request , false )
127
+ if err != nil {
128
+ return mcp .NewToolResultError (err .Error ()), nil
129
+ }
130
+
131
+ data , err := client .ListCostCategories (ctx , scope , params )
132
+ if err != nil {
133
+ return nil , fmt .Errorf ("failed to get CCM Cost Categories: %w" , err )
134
+ }
135
+
136
+ r , err := json .Marshal (data )
137
+ if err != nil {
138
+ return nil , fmt .Errorf ("failed to marshal CCM Cost Category: %w" , err )
139
+ }
140
+
141
+ return mcp .NewToolResultText (string (r )), nil
142
+ }
143
+ }
144
+
82
145
// getAccountID retrieves AccountID from the config file
83
146
func getAccountID (config * config.Config , request mcp.CallToolRequest ) (string , error ) {
84
147
scope , scopeErr := fetchScope (config , request , true )
0 commit comments