@@ -12,6 +12,7 @@ import (
12
12
13
13
"github.com/harness/harness-mcp/cmd/harness-mcp-server/config"
14
14
"github.com/harness/harness-mcp/pkg/harness"
15
+ "github.com/harness/harness-mcp/pkg/harness/auth"
15
16
"github.com/harness/harness-mcp/pkg/harness/prompts"
16
17
"github.com/harness/harness-mcp/pkg/modules"
17
18
"github.com/harness/harness-mcp/pkg/types/enum"
@@ -145,6 +146,106 @@ var (
145
146
return nil
146
147
},
147
148
}
149
+
150
+ // TODO: this will move to streamable HTTP once the service is setup
151
+ internalCmd = & cobra.Command {
152
+ Use : "internal" ,
153
+ Short : "Start stdio server in internal mode" ,
154
+ Long : `Start a server that communicates via standard input/output streams using JSON-RPC messages with additional internal credentials.` ,
155
+ RunE : func (_ * cobra.Command , _ []string ) error {
156
+ ctx , stop := signal .NotifyContext (context .Background (), os .Interrupt , syscall .SIGTERM )
157
+ defer stop ()
158
+
159
+ // TODO: get this from request header and add in the context once we move to streamable HTTP
160
+ bearerToken := viper .GetString ("bearer_token" )
161
+ if bearerToken == "" {
162
+ return fmt .Errorf ("bearer token not provided" )
163
+ }
164
+
165
+ mcpSecret := viper .GetString ("mcp_svc_secret" )
166
+ if mcpSecret == "" {
167
+ return fmt .Errorf ("MCP service secret not provided" )
168
+ }
169
+
170
+ // Move this out to middleware once we move to streamable HTTP
171
+ session , err := auth .AuthenticateSession (bearerToken , mcpSecret )
172
+ if err != nil {
173
+ return fmt .Errorf ("Failed to authenticate session: %w" , err )
174
+ }
175
+
176
+ // Store the authenticated session in the context
177
+ ctx = auth .WithAuthSession (ctx , session )
178
+
179
+ var toolsets []string
180
+ err = viper .UnmarshalKey ("toolsets" , & toolsets )
181
+ if err != nil {
182
+ return fmt .Errorf ("Failed to unmarshal toolsets: %w" , err )
183
+ }
184
+
185
+ var enableModules []string
186
+ err = viper .UnmarshalKey ("enable_modules" , & enableModules )
187
+ if err != nil {
188
+ return fmt .Errorf ("Failed to unmarshal enabled modules: %w" , err )
189
+ }
190
+
191
+ cfg := config.Config {
192
+ // Common fields
193
+ Version : version ,
194
+ ReadOnly : true , // we keep it read-only for now
195
+ Toolsets : toolsets ,
196
+ EnableModules : enableModules ,
197
+ LogFilePath : viper .GetString ("log_file" ),
198
+ Debug : viper .GetBool ("debug" ),
199
+ EnableLicense : viper .GetBool ("enable_license" ),
200
+ Internal : true ,
201
+ AccountID : session .Principal .AccountID ,
202
+ // Internal mode specific fields
203
+ BearerToken : viper .GetString ("bearer_token" ),
204
+ PipelineSvcBaseURL : viper .GetString ("pipeline_svc_base_url" ),
205
+ PipelineSvcSecret : viper .GetString ("pipeline_svc_secret" ),
206
+ NgManagerBaseURL : viper .GetString ("ng_manager_base_url" ),
207
+ NgManagerSecret : viper .GetString ("ng_manager_secret" ),
208
+ ChatbotBaseURL : viper .GetString ("chatbot_base_url" ),
209
+ ChatbotSecret : viper .GetString ("chatbot_secret" ),
210
+ GenaiBaseURL : viper .GetString ("genai_base_url" ),
211
+ GenaiSecret : viper .GetString ("genai_secret" ),
212
+ ArtifactRegistryBaseURL : viper .GetString ("artifact_registry_base_url" ),
213
+ ArtifactRegistrySecret : viper .GetString ("artifact_registry_secret" ),
214
+ NextgenCEBaseURL : viper .GetString ("nextgen_ce_base_url" ),
215
+ NextgenCESecret : viper .GetString ("nextgen_ce_secret" ),
216
+ CCMCommOrchBaseURL : viper .GetString ("ccm_comm_orch_base_url" ),
217
+ CCMCommOrchSecret : viper .GetString ("ccm_comm_orch_secret" ),
218
+ IDPSvcBaseURL : viper .GetString ("idp_svc_base_url" ),
219
+ IDPSvcSecret : viper .GetString ("idp_svc_secret" ),
220
+ McpSvcSecret : viper .GetString ("mcp_svc_secret" ),
221
+ ChaosManagerSvcBaseURL : viper .GetString ("chaos_manager_svc_base_url" ),
222
+ ChaosManagerSvcSecret : viper .GetString ("chaos_manager_svc_secret" ),
223
+ TemplateSvcBaseURL : viper .GetString ("template_svc_base_url" ),
224
+ TemplateSvcSecret : viper .GetString ("template_svc_secret" ),
225
+ IntelligenceSvcBaseURL : viper .GetString ("intelligence_svc_base_url" ),
226
+ IntelligenceSvcSecret : viper .GetString ("intelligence_svc_secret" ),
227
+ CodeSvcBaseURL : viper .GetString ("code_svc_base_url" ),
228
+ CodeSvcSecret : viper .GetString ("code_svc_secret" ),
229
+ LogSvcBaseURL : viper .GetString ("log_svc_base_url" ),
230
+ LogSvcSecret : viper .GetString ("log_svc_secret" ),
231
+ SCSSvcSecret : viper .GetString ("scs_svc_secret" ),
232
+ SCSSvcBaseURL : viper .GetString ("scs_svc_base_url" ),
233
+ STOSvcSecret : viper .GetString ("sto_svc_secret" ),
234
+ STOSvcBaseURL : viper .GetString ("sto_svc_base_url" ),
235
+ AuditSvcBaseURL : viper .GetString ("audit_svc_base_url" ),
236
+ AuditSvcSecret : viper .GetString ("audit_svc_secret" ),
237
+ DBOpsSvcBaseURL : viper .GetString ("dbops_svc_base_url" ),
238
+ DBOpsSvcSecret : viper .GetString ("dbops_svc_secret" ),
239
+ RBACSvcBaseURL : viper .GetString ("rbac_svc_base_url" ),
240
+ RBACSvcSecret : viper .GetString ("rbac_svc_secret" ),
241
+ }
242
+
243
+ if err := runStdioServer (ctx , cfg ); err != nil {
244
+ return fmt .Errorf ("failed to run stdio server: %w" , err )
245
+ }
246
+ return nil
247
+ },
248
+ }
148
249
)
149
250
150
251
func init () {
@@ -174,6 +275,40 @@ func init() {
174
275
stdioCmd .Flags ().String ("default-project-id" , "" ,
175
276
"Default project ID to use. If not specified, it would need to be passed in the query (if required)" )
176
277
278
+ // Add internal-specific flags
279
+ internalCmd .Flags ().String ("bearer-token" , "" , "Bearer token for authentication" )
280
+ internalCmd .Flags ().String ("pipeline-svc-base-url" , "" , "Base URL for pipeline service" )
281
+ internalCmd .Flags ().String ("pipeline-svc-secret" , "" , "Secret for pipeline service" )
282
+ internalCmd .Flags ().String ("ng-manager-base-url" , "" , "Base URL for NG manager" )
283
+ internalCmd .Flags ().String ("ng-manager-secret" , "" , "Secret for NG manager" )
284
+ internalCmd .Flags ().String ("chatbot-base-url" , "" , "Base URL for chatbot service" )
285
+ internalCmd .Flags ().String ("chatbot-secret" , "" , "Secret for chatbot service" )
286
+ internalCmd .Flags ().String ("genai-base-url" , "" , "Base URL for genai service" )
287
+ internalCmd .Flags ().String ("genai-secret" , "" , "Secret for genai service" )
288
+ internalCmd .Flags ().String ("mcp-svc-secret" , "" , "Secret for MCP service" )
289
+ internalCmd .Flags ().String ("artifact-registry-base-url" , "" , "Base URL for artifact registry service" )
290
+ internalCmd .Flags ().String ("artifact-registry-secret" , "" , "Secret for artifact registry service" )
291
+ internalCmd .Flags ().String ("nextgen-ce-base-url" , "" , "Base URL for Nextgen CE service" )
292
+ internalCmd .Flags ().String ("nextgen-ce-secret" , "" , "Secret for Nextgen CE service" )
293
+ internalCmd .Flags ().String ("chaos-manager-svc-base-url" , "" , "Base URL for chaos manager service" )
294
+ internalCmd .Flags ().String ("chaos-manager-svc-secret" , "" , "Secret for chaos manager service" )
295
+ internalCmd .Flags ().String ("code-svc-base-url" , "" , "Base URL for code service" )
296
+ internalCmd .Flags ().String ("code-svc-secret" , "" , "Secret for code service" )
297
+ internalCmd .Flags ().String ("dashboard-svc-base-url" , "" , "Base URL for dashboard service" )
298
+ internalCmd .Flags ().String ("dashboard-svc-secret" , "" , "Secret for dashboard service" )
299
+ internalCmd .Flags ().String ("log-svc-base-url" , "" , "Base URL for log service" )
300
+ internalCmd .Flags ().String ("log-service-secret" , "" , "Secret for log service" )
301
+ internalCmd .Flags ().String ("scs-svc-secret" , "" , "Secret for SCS service" )
302
+ internalCmd .Flags ().String ("scs-svc-base-url" , "" , "Base URL for SCS service" )
303
+ internalCmd .Flags ().String ("sto-svc-secret" , "" , "Secret for STO service" )
304
+ internalCmd .Flags ().String ("sto-svc-base-url" , "" , "Base URL for STO service" )
305
+ internalCmd .Flags ().String ("audit-svc-base-url" , "" , "Base URL for audit service" )
306
+ internalCmd .Flags ().String ("audit-svc-secret" , "" , "Secret for audit service" )
307
+ internalCmd .Flags ().String ("dbops-svc-base-url" , "" , "Base URL for dbops service" )
308
+ internalCmd .Flags ().String ("dbops-svc-secret" , "" , "Secret for dbops service" )
309
+ internalCmd .Flags ().String ("rbac-svc-base-url" , "" , "Base URL for RBAC service" )
310
+ internalCmd .Flags ().String ("rbac-svc-secret" , "" , "Secret for RBAC service" )
311
+
177
312
// Bind global flags to viper
178
313
_ = viper .BindPFlag ("toolsets" , rootCmd .PersistentFlags ().Lookup ("toolsets" ))
179
314
_ = viper .BindPFlag ("enable_modules" , rootCmd .PersistentFlags ().Lookup ("enable-modules" ))
@@ -193,9 +328,48 @@ func init() {
193
328
_ = viper .BindPFlag ("default_org_id" , stdioCmd .Flags ().Lookup ("default-org-id" ))
194
329
_ = viper .BindPFlag ("default_project_id" , stdioCmd .Flags ().Lookup ("default-project-id" ))
195
330
331
+ // Bind internal-specific flags to viper
332
+ _ = viper .BindPFlag ("bearer_token" , internalCmd .Flags ().Lookup ("bearer-token" ))
333
+ _ = viper .BindPFlag ("pipeline_svc_base_url" , internalCmd .Flags ().Lookup ("pipeline-svc-base-url" ))
334
+ _ = viper .BindPFlag ("pipeline_svc_secret" , internalCmd .Flags ().Lookup ("pipeline-svc-secret" ))
335
+ _ = viper .BindPFlag ("ng_manager_base_url" , internalCmd .Flags ().Lookup ("ng-manager-base-url" ))
336
+ _ = viper .BindPFlag ("ng_manager_secret" , internalCmd .Flags ().Lookup ("ng-manager-secret" ))
337
+ _ = viper .BindPFlag ("chatbot_base_url" , internalCmd .Flags ().Lookup ("chatbot-base-url" ))
338
+ _ = viper .BindPFlag ("chatbot_secret" , internalCmd .Flags ().Lookup ("chatbot-secret" ))
339
+ _ = viper .BindPFlag ("genai_base_url" , internalCmd .Flags ().Lookup ("genai-base-url" ))
340
+ _ = viper .BindPFlag ("genai_secret" , internalCmd .Flags ().Lookup ("genai-secret" ))
341
+ _ = viper .BindPFlag ("mcp_svc_secret" , internalCmd .Flags ().Lookup ("mcp-svc-secret" ))
342
+ _ = viper .BindPFlag ("artifact_registry_base_url" , internalCmd .Flags ().Lookup ("artifact-registry-base-url" ))
343
+ _ = viper .BindPFlag ("artifact_registry_secret" , internalCmd .Flags ().Lookup ("artifact-registry-secret" ))
344
+ _ = viper .BindPFlag ("nextgen_ce_base_url" , internalCmd .Flags ().Lookup ("nextgen-ce-base-url" ))
345
+ _ = viper .BindPFlag ("nextgen_ce_secret" , internalCmd .Flags ().Lookup ("nextgen-ce-secret" ))
346
+ _ = viper .BindPFlag ("template_svc_base_url" , internalCmd .Flags ().Lookup ("template-svc-base-url" ))
347
+ _ = viper .BindPFlag ("template_svc_secret" , internalCmd .Flags ().Lookup ("template-svc-secret" ))
348
+ _ = viper .BindPFlag ("intelligence_svc_base_url" , internalCmd .Flags ().Lookup ("intelligence-svc-base-url" ))
349
+ _ = viper .BindPFlag ("intelligence_svc_secret" , internalCmd .Flags ().Lookup ("intelligence-svc-secret" ))
350
+ _ = viper .BindPFlag ("chaos_manager_svc_base_url" , internalCmd .Flags ().Lookup ("chaos-manager-svc-base-url" ))
351
+ _ = viper .BindPFlag ("chaos_manager_svc_secret" , internalCmd .Flags ().Lookup ("chaos-manager-svc-secret" ))
352
+ _ = viper .BindPFlag ("code_svc_base_url" , internalCmd .Flags ().Lookup ("code-svc-base-url" ))
353
+ _ = viper .BindPFlag ("code_svc_secret" , internalCmd .Flags ().Lookup ("code-svc-secret" ))
354
+ _ = viper .BindPFlag ("dashboard_svc_base_url" , internalCmd .Flags ().Lookup ("dashboard-svc-base-url" ))
355
+ _ = viper .BindPFlag ("dashboard_svc_secret" , internalCmd .Flags ().Lookup ("dashboard-svc-secret" ))
356
+ _ = viper .BindPFlag ("log_svc_base_url" , internalCmd .Flags ().Lookup ("log-svc-base-url" ))
357
+ _ = viper .BindPFlag ("log_svc_secret" , internalCmd .Flags ().Lookup ("log-svc-secret" ))
358
+ _ = viper .BindPFlag ("scs_svc_secret" , internalCmd .Flags ().Lookup ("scs-svc-secret" ))
359
+ _ = viper .BindPFlag ("scs_svc_base_url" , internalCmd .Flags ().Lookup ("scs-svc-base-url" ))
360
+ _ = viper .BindPFlag ("sto_svc_secret" , internalCmd .Flags ().Lookup ("sto-svc-secret" ))
361
+ _ = viper .BindPFlag ("sto_svc_base_url" , internalCmd .Flags ().Lookup ("sto-svc-base-url" ))
362
+ _ = viper .BindPFlag ("audit_svc_base_url" , internalCmd .Flags ().Lookup ("audit-svc-base-url" ))
363
+ _ = viper .BindPFlag ("audit_svc_secret" , internalCmd .Flags ().Lookup ("audit-svc-secret" ))
364
+ _ = viper .BindPFlag ("dbops_svc_base_url" , internalCmd .Flags ().Lookup ("dbops-svc-base-url" ))
365
+ _ = viper .BindPFlag ("dbops_svc_secret" , internalCmd .Flags ().Lookup ("dbops-svc-secret" ))
366
+ _ = viper .BindPFlag ("rbac_svc_base_url" , internalCmd .Flags ().Lookup ("rbac-svc-base-url" ))
367
+ _ = viper .BindPFlag ("rbac_svc_secret" , internalCmd .Flags ().Lookup ("rbac-svc-secret" ))
368
+
196
369
// Add subcommands
197
370
rootCmd .AddCommand (serverCmd )
198
371
rootCmd .AddCommand (stdioCmd )
372
+ stdioCmd .AddCommand (internalCmd )
199
373
}
200
374
201
375
func initConfig () {
0 commit comments