@@ -77,18 +77,18 @@ func main() {
77
77
}
78
78
79
79
func printUsage () {
80
- fmt .Println ("MCP Registry Publisher Tool" )
81
- fmt .Println ()
82
- fmt .Println ("Usage:" )
83
- fmt .Println (" mcp-publisher publish [flags] Publish a server.json file to the registry" )
84
- fmt .Println (" mcp-publisher create [flags] Create a new server.json file" )
85
- fmt .Println ()
86
- fmt .Println ("Use 'mcp-publisher <command> --help' for more information about a command." )
80
+ log .Println ("MCP Registry Publisher Tool" )
81
+ log .Println ()
82
+ log .Println ("Usage:" )
83
+ log .Println (" mcp-publisher publish [flags] Publish a server.json file to the registry" )
84
+ log .Println (" mcp-publisher create [flags] Create a new server.json file" )
85
+ log .Println ()
86
+ log .Println ("Use 'mcp-publisher <command> --help' for more information about a command." )
87
87
}
88
88
89
89
func publishCommand () {
90
90
publishFlags := flag .NewFlagSet ("publish" , flag .ExitOnError )
91
-
91
+
92
92
var registryURL string
93
93
var mcpFilePath string
94
94
var forceLogin bool
@@ -100,7 +100,9 @@ func publishCommand() {
100
100
publishFlags .BoolVar (& forceLogin , "login" , false , "force a new login even if a token exists" )
101
101
publishFlags .StringVar (& authMethod , "auth-method" , "github-oauth" , "authentication method to use (default: github-oauth)" )
102
102
103
- publishFlags .Parse (os .Args [2 :])
103
+ if err := publishFlags .Parse (os .Args [2 :]); err != nil {
104
+ log .Fatalf ("Error parsing flags: %v" , err )
105
+ }
104
106
105
107
if registryURL == "" || mcpFilePath == "" {
106
108
publishFlags .Usage ()
@@ -153,22 +155,22 @@ func publishCommand() {
153
155
154
156
func createCommand () {
155
157
createFlags := flag .NewFlagSet ("create" , flag .ExitOnError )
156
-
158
+
157
159
// Basic server information flags
158
160
var name string
159
161
var description string
160
162
var version string
161
163
var repoURL string
162
164
var repoSource string
163
165
var output string
164
-
166
+
165
167
// Package information flags
166
168
var registryName string
167
169
var packageName string
168
170
var packageVersion string
169
171
var runtimeHint string
170
172
var execute string
171
-
173
+
172
174
// Repeatable flags
173
175
var envVars []string
174
176
var packageArgs []string
@@ -183,27 +185,29 @@ func createCommand() {
183
185
createFlags .StringVar (& repoSource , "repo-source" , "github" , "Repository source" )
184
186
createFlags .StringVar (& output , "output" , "server.json" , "Output file path" )
185
187
createFlags .StringVar (& output , "o" , "server.json" , "Output file path (shorthand)" )
186
-
188
+
187
189
createFlags .StringVar (& registryName , "registry" , "npm" , "Package registry name" )
188
190
createFlags .StringVar (& packageName , "package-name" , "" , "Package name (defaults to server name)" )
189
191
createFlags .StringVar (& packageVersion , "package-version" , "" , "Package version (defaults to server version)" )
190
192
createFlags .StringVar (& runtimeHint , "runtime-hint" , "" , "Runtime hint (e.g., docker)" )
191
193
createFlags .StringVar (& execute , "execute" , "" , "Command to execute the server" )
192
194
createFlags .StringVar (& execute , "e" , "" , "Command to execute the server (shorthand)" )
193
-
195
+
194
196
// Custom flag for environment variables
195
197
createFlags .Func ("env-var" , "Environment variable in format NAME:DESCRIPTION (can be repeated)" , func (value string ) error {
196
198
envVars = append (envVars , value )
197
199
return nil
198
200
})
199
-
201
+
200
202
// Custom flag for package arguments
201
203
createFlags .Func ("package-arg" , "Package argument in format VALUE:DESCRIPTION (can be repeated)" , func (value string ) error {
202
204
packageArgs = append (packageArgs , value )
203
205
return nil
204
206
})
205
207
206
- createFlags .Parse (os .Args [2 :])
208
+ if err := createFlags .Parse (os .Args [2 :]); err != nil {
209
+ log .Fatalf ("Error parsing flags: %v" , err )
210
+ }
207
211
208
212
// Validate required flags
209
213
if name == "" {
@@ -225,7 +229,8 @@ func createCommand() {
225
229
}
226
230
227
231
// Create server structure
228
- server := createServerStructure (name , description , version , repoURL , repoSource , registryName , packageName , packageVersion , runtimeHint , execute , envVars , packageArgs )
232
+ server := createServerStructure (name , description , version , repoURL , repoSource ,
233
+ registryName , packageName , packageVersion , runtimeHint , execute , envVars , packageArgs )
229
234
230
235
// Convert to JSON
231
236
jsonData , err := json .MarshalIndent (server , "" , " " )
@@ -234,7 +239,7 @@ func createCommand() {
234
239
}
235
240
236
241
// Write to file
237
- err = os .WriteFile (output , jsonData , 0644 )
242
+ err = os .WriteFile (output , jsonData , 0600 )
238
243
if err != nil {
239
244
log .Fatalf ("Error writing file: %v" , err )
240
245
}
@@ -300,7 +305,8 @@ func publishToRegistry(registryURL string, mcpData []byte, token string) error {
300
305
return nil
301
306
}
302
307
303
- func createServerStructure (name , description , version , repoURL , repoSource , registryName , packageName , packageVersion , runtimeHint , execute string , envVars []string , packageArgs []string ) ServerJSON {
308
+ func createServerStructure (name , description , version , repoURL , repoSource , registryName ,
309
+ packageName , packageVersion , runtimeHint , execute string , envVars []string , packageArgs []string ) ServerJSON {
304
310
// Parse environment variables
305
311
var environmentVariables []EnvironmentVariable
306
312
for _ , envVar := range envVars {
@@ -328,7 +334,7 @@ func createServerStructure(name, description, version, repoURL, repoSource, regi
328
334
if len (parts ) == 2 {
329
335
description = parts [1 ]
330
336
}
331
-
337
+
332
338
packageArguments = append (packageArguments , RuntimeArgument {
333
339
Description : description ,
334
340
IsRequired : true , // Package arguments are typically required
@@ -349,15 +355,16 @@ func createServerStructure(name, description, version, repoURL, repoSource, regi
349
355
// Skip the first part (command) and add each argument as a runtime argument
350
356
for i , arg := range parts [1 :] {
351
357
description := fmt .Sprintf ("Runtime argument %d" , i + 1 )
352
-
358
+
353
359
// Try to provide better descriptions based on common patterns
354
- if strings .HasPrefix (arg , "--" ) {
360
+ switch {
361
+ case strings .HasPrefix (arg , "--" ):
355
362
description = fmt .Sprintf ("Command line flag: %s" , arg )
356
- } else if strings .HasPrefix (arg , "-" ) && len (arg ) == 2 {
363
+ case strings .HasPrefix (arg , "-" ) && len (arg ) == 2 :
357
364
description = fmt .Sprintf ("Command line option: %s" , arg )
358
- } else if strings .Contains (arg , "=" ) {
365
+ case strings .Contains (arg , "=" ):
359
366
description = fmt .Sprintf ("Configuration parameter: %s" , arg )
360
- } else if i > 0 && strings .HasPrefix (parts [i ], "-" ) {
367
+ case i > 0 && strings .HasPrefix (parts [i ], "-" ):
361
368
description = fmt .Sprintf ("Value for %s" , parts [i ])
362
369
}
363
370
@@ -410,13 +417,14 @@ func smartSplit(command string) []string {
410
417
for _ , char := range command {
411
418
switch {
412
419
case char == '"' || char == '\'' :
413
- if ! inQuotes {
420
+ switch {
421
+ case ! inQuotes :
414
422
inQuotes = true
415
423
quoteChar = char
416
- } else if char == quoteChar {
424
+ case char == quoteChar :
417
425
inQuotes = false
418
426
quoteChar = 0
419
- } else {
427
+ default :
420
428
current .WriteRune (char )
421
429
}
422
430
case char == ' ' && ! inQuotes :
0 commit comments