@@ -6,9 +6,11 @@ import (
6
6
"fmt"
7
7
"log/slog"
8
8
"math"
9
+ "strings"
9
10
"time"
10
11
11
12
"github.com/harness/harness-mcp/client"
13
+ "github.com/harness/harness-mcp/client/dto"
12
14
"github.com/harness/harness-mcp/cmd/harness-mcp-server/config"
13
15
"github.com/mark3labs/mcp-go/mcp"
14
16
"github.com/mark3labs/mcp-go/server"
@@ -78,6 +80,37 @@ func ListUserAuditTrailTool(config *config.Config, auditClient *client.AuditServ
78
80
"ROLE_ASSIGNMENT_CREATED" , "ROLE_ASSIGNMENT_UPDATED" , "ROLE_ASSIGNMENT_DELETED" , "MOVE" , "ENABLED" , "DISABLED" , "DISMISS_ANOMALY" , "RERUN" , "BYPASS" , "STABLE_VERSION_CHANGED" ,
79
81
"SYNC_START" , "START_IMPERSONATION" , "END_IMPERSONATION" , "MOVE_TO_GIT" , "FREEZE_BYPASS" , "EXPIRED" , "FORCE_PUSH" ),
80
82
),
83
+
84
+ mcp .WithString ("resource_type" ,
85
+ mcp .Description ("Optional resource type to filter by." ),
86
+ mcp .Enum ("ORGANIZATION" , "PROJECT" , "USER_GROUP" , "SECRET" , "CERTIFICATE" , "STREAMING_DESTINATION" , "RESOURCE_GROUP" ,
87
+ "USER" , "ROLE" , "PIPELINE" , "TRIGGER" , "TEMPLATE" , "INPUT_SET" , "DELEGATE_CONFIGURATION" , "DELEGATE_GROUPS" ,
88
+ "SERVICE" , "ENVIRONMENT" , "ENVIRONMENT_GROUP" , "DELEGATE" , "SERVICE_ACCOUNT" , "CONNECTOR" , "API_KEY" ,
89
+ "TOKEN" , "DELEGATE_TOKEN" , "DASHBOARD" , "DASHBOARD_FOLDER" , "GOVERNANCE_POLICY" , "GOVERNANCE_POLICY_SET" ,
90
+ "VARIABLE" , "CHAOS_HUB" , "MONITORED_SERVICE" , "CHAOS_INFRASTRUCTURE" , "CHAOS_EXPERIMENT" , "CHAOS_GAMEDAY" ,
91
+ "CHAOS_PROBE" , "STO_TARGET" , "STO_EXEMPTION" , "SERVICE_LEVEL_OBJECTIVE" , "PERSPECTIVE" , "PERSPECTIVE_BUDGET" ,
92
+ "PERSPECTIVE_REPORT" , "COST_CATEGORY" , "COMMITMENT_ORCHESTRATOR_SETUP" , "COMMITMENT_ACTIONS" ,
93
+ "CLUSTER_ORCHESTRATOR_SETUP" , "CLUSTER_ACTIONS" , "SMTP" , "PERSPECTIVE_FOLDER" , "AUTOSTOPPING_RULE" ,
94
+ "AUTOSTOPPING_LB" , "AUTOSTOPPING_STARTSTOP" , "SETTING" , "NG_LOGIN_SETTINGS" , "DEPLOYMENT_FREEZE" ,
95
+ "CLOUD_ASSET_GOVERNANCE_RULE" , "CLOUD_ASSET_GOVERNANCE_RULE_SET" , "CLOUD_ASSET_GOVERNANCE_RULE_ENFORCEMENT" ,
96
+ "TARGET_GROUP" , "FEATURE_FLAG" , "FEATURE_FLAG_STALE_CONFIG" , "NG_ACCOUNT_DETAILS" , "BUDGET_GROUP" ,
97
+ "IP_ALLOWLIST_CONFIG" , "NETWORK_MAP" , "CET_AGENT_TOKEN" , "CET_CRITICAL_EVENT" , "CHAOS_SECURITY_GOVERNANCE" ,
98
+ "END_USER_LICENSE_AGREEMENT" , "WORKSPACE" , "IAC_MODULE" , "SEI_CONFIGURATION_SETTINGS" , "SEI_COLLECTIONS" ,
99
+ "SEI_INSIGHTS" , "SEI_PANORAMA" , "CET_SAVED_FILTER" , "GITOPS_AGENT" , "GITOPS_REPOSITORY" , "GITOPS_CLUSTER" ,
100
+ "GITOPS_CREDENTIAL_TEMPLATE" , "GITOPS_REPOSITORY_CERTIFICATE" , "GITOPS_GNUPG_KEY" , "GITOPS_PROJECT_MAPPING" ,
101
+ "GITOPS_APPLICATION" , "GITOPS_APPLICATION_SET" , "CODE_REPOSITORY" , "CODE_REPOSITORY_SETTINGS" , "CODE_BRANCH_RULE" ,
102
+ "CODE_PUSH_RULE" , "CODE_TAG_RULE" , "CODE_BRANCH" , "CODE_TAG" , "CODE_WEBHOOK" , "MODULE_LICENSE" ,
103
+ "IDP_BACKSTAGE_CATALOG_ENTITY" , "IDP_BACKSTAGE_SCAFFOLDER_TASK" , "IDP_APP_CONFIGS" , "IDP_CONFIG_ENV_VARIABLES" ,
104
+ "IDP_PROXY_HOST" , "IDP_SCORECARDS" , "IDP_CHECKS" , "IDP_ALLOW_LIST" , "IDP_OAUTH_CONFIG" , "IDP_CATALOG_CONNECTOR" ,
105
+ "IDP_GIT_INTEGRATIONS" , "IDP_PERMISSIONS" , "IDP_CATALOG" , "IDP_WORKFLOW" , "SERVICE_DISCOVERY_AGENT" ,
106
+ "APPLICATION_MAP" , "IDP_LAYOUT" , "IDP_PLUGINS" , "NOTIFICATION_CHANNEL" , "NOTIFICATION_RULE" ,
107
+ "IDP_CATALOG_CUSTOM_PROPERTIES" , "CLOUD_ASSET_GOVERNANCE_RULE_EVALUATION" , "ARTIFACT_REGISTRY_UPSTREAM_PROXY" ,
108
+ "ARTIFACT_REGISTRY" , "BANNER" , "GITX_WEBHOOK" , "FILE" , "CHAOS_IMAGE_REGISTRY" , "DB_SCHEMA" , "DB_INSTANCE" ,
109
+ "CCM_ANOMALY" , "CCM_ANOMALY_ALERT" , "CLOUD_ASSET_GOVERNANCE_NOTIFICATION" , "CDE_GITSPACE" , "DEFAULT_NOTIFICATION_TEMPLATE_SET" ),
110
+ ),
111
+ mcp .WithString ("resource_identifier" ,
112
+ mcp .Description ("Optional resource identifier to filter by. Must be used with resource_type." ),
113
+ ),
81
114
WithScope (config , false ),
82
115
WithPagination (),
83
116
),
@@ -94,6 +127,16 @@ func ListUserAuditTrailTool(config *config.Config, auditClient *client.AuditServ
94
127
return mcp .NewToolResultError (err .Error ()), nil
95
128
}
96
129
130
+ resourceType , err := OptionalParam [string ](request , "resource_type" )
131
+ if err != nil {
132
+ return mcp .NewToolResultError (err .Error ()), nil
133
+ }
134
+
135
+ resourceIdentifier , err := OptionalParam [string ](request , "resource_identifier" )
136
+ if err != nil {
137
+ return mcp .NewToolResultError (err .Error ()), nil
138
+ }
139
+
97
140
scope , err := FetchScope (config , request , false )
98
141
if err != nil {
99
142
return mcp .NewToolResultError (err .Error ()), nil
@@ -115,15 +158,32 @@ func ListUserAuditTrailTool(config *config.Config, auditClient *client.AuditServ
115
158
endTimeMilliseconds := convertDateToMilliseconds (endTime )
116
159
slog .Info ("Converted time range" , "start_time_ms" , startTimeMilliseconds , "end_time_ms" , endTimeMilliseconds )
117
160
161
+ // Create filter options
162
+ opts := & dto.ListAuditEventsFilter {}
163
+
164
+ // Set default filter type
165
+ opts .FilterType = "Audit"
166
+
167
+ // Add resource filter if provided
168
+ if strings .TrimSpace (resourceType ) != "" {
169
+ opts .Resources = []dto.AuditResource {{
170
+ Type : resourceType ,
171
+ Identifier : resourceIdentifier ,
172
+ }}
173
+ slog .Info ("Adding resource filter" , "resource_type" , resourceType , "resource_identifier" , resourceIdentifier )
174
+ }
175
+
118
176
slog .Info ("Calling ListUserAuditTrail API" ,
119
177
"user_id_list" , userIDList ,
120
178
"actions" , actionsList ,
179
+ "resource_type" , resourceType ,
180
+ "resource_identifier" , resourceIdentifier ,
121
181
"page" , page ,
122
182
"size" , size ,
123
183
"start_time_ms" , startTimeMilliseconds ,
124
184
"end_time_ms" , endTimeMilliseconds )
125
185
126
- data , err := auditClient .ListUserAuditTrail (ctx , scope , userIDList , actionsList , page , size , startTimeMilliseconds , endTimeMilliseconds , nil )
186
+ data , err := auditClient .ListUserAuditTrail (ctx , scope , userIDList , actionsList , page , size , startTimeMilliseconds , endTimeMilliseconds , opts )
127
187
if err != nil {
128
188
return nil , fmt .Errorf ("failed to list the audit logs: %w" , err )
129
189
}
0 commit comments